图案打印

来源:互联网 发布:2016中国汽车销量数据 编辑:程序博客网 时间:2024/06/02 08:54

题目描述

一年一度的植树节就要到了,计算机学院学生准备在学院教学楼门前的空地上种植树木。为使树木排列得更加美观,大家决定把树木排列成菱形。现在告诉你我们所拥有的树木能排列成边长为N的菱形,请你编程输出树木所排列的图案(用*号代表树木)。

输入

一个整数N(1≤N≤10)。

输出

排列成菱形图案的*号。请注意在图案中:每行树木之间无空行,每列树木之间均有一个空列。

示例输入

3

示例输出

    *  *   **       *  *   *    *


       我写这个题时没有注意到树木之间有空列 改了n次都错误,这种题时学c语言来接触最早的题目 当时就能很好的写出来 可是现在确写的很费劲,多数在凑,先大体上写出来然后输入答案一点一点的修改,写完很不爽,决定写个东西记录一下 ,捋一捋,这也是我第一次写博客,希望可以坚持。
      



      我一般两种思路  1是直接输出 2是用数组;

先说直接输出吧;

第一行的* 在2*n-1(n是个数)的位置
第二行的* 在2*(n-1)-1  的位置 和2*n-1+2的位置也就是2*(n+1)-1的位置
第三行的* 在2*(n-2)-1的位置 和2*(n+1)-1+2的位置(就是在上一行出现的位置加2) 也就是2*(n+2)-1
。。。。。

for(int i=0;i<n;i++){for(int j=1;j<=2*(n+i)-1;j++)//其中 2*(n+i)-1为 2*n-1+i*n; {if(j==2*(n-i)-1||j==2*(n+i)-1) cout<<'*';else cout<<' ';}cout<<endl;}


然后处理下面的行
从n+1行开始 我们认为是第i行 的 第一个*在 2*(i-n)+1的位置 和第 4*n-3(这是最长的一行的长度,也就是第n行的长度)-(i-n)*2;
随着i的不断增加 第一个星的位置逐渐相互移动,第一个星的位置逐渐向前移动,最后一行重合了;

我们同样可以让第n-1行是第i=1行这样更好操作
这样第n-1 行的星就是 2*i+1 的位置 和 (4*n-3)-(2*i)的位置

for(int i=1;i<n;i++){for(int j=1;j<=(4*n-3)-(2*i);j++){if(j==i*2+1||j==(4*n-3)-(2*i)) cout<<"*";else cout<<" ";}cout<<endl;} 

http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1127

#include<cstring>using namespace std;int main(){int n;cin>>n;for(int i=0;i<n;i++){for(int j=1;j<=2*(n+i)-1;j++)//其中 2*(n+i)-1为 2*n-1+i*n; {if(j==2*(n-i)-1||j==2*(n+i)-1) cout<<'*';else cout<<' ';}cout<<endl;}for(int i=1;i<n;i++){for(int j=1;j<=(4*n-3)-(2*i);j++){if(j==i*2+1||j==(4*n-3)-(2*i)) cout<<"*";else cout<<" ";}cout<<endl;} }

数组方法跟这个一样;



关键找出每行的长度 for循环不要输出了多余的空格 ;
 
后面的*找出最长的长度每次递减就行了  

前面的每次递增就行了
0 0