回形嵌套
***********
* *
* ******* *
* * * *
* * *** * *
* * * * * *
* * *** * *
* * * *
* ******* *
* *
***********
观察这个图形,它是由一系列正方形的星号方框嵌套而成。
在上边的例子中,最外方框的边长为11。
本题的任务就是从标准输入获得一个整数n(1<n<100)
程序则生成嵌套着的回字型星号方框。其最外层方框的边长为n
例如:
输入:
5
程序输出:
*****
* *
* * *
* *
*****
输入:6
程序输出:
******
* *
* ** *
* ** *
* *
******
解题思路:
用一个n*n的二维数组存储图形,从最外层到内层二重循环添加*号。
每次循环以每层回形的左上角一点为起始坐标,分别向行和列补充*号;
起始点坐标的规律特点是从(0,0),(2,2),(4,4)一直到(limit,limit)。
其中limit一定是一个偶数,计算方式为:不大于n/2的最大偶数(详见代码)。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
char a[100][100];
int r=0,c=0;//行、列
void output(int n)//输出图形
{
for(int i=0; i<n; ++i)
{
for(int j=0; j<n; ++j)
cout<<a[i][j];
cout<<endl;
}
cout<<endl;
}
int main()
{
int n;
cin>>n;
memset(a,' ',sizeof(a));//清空数组
int limit=n/2;//坐标最大值
if(limit%2!=0)//偶数
--limit;
for(int j=0; j<=limit; j+=2)
{
for(int i=j; i<n-j; ++i)
{
a[j][i]=a[n-1-j][i]='*';//行
a[i][j]=a[i][n-1-j]='*';//列
}
//output(n);//输出便于查看从最外层到内层的变化情况
}
output(n);
return 0;
}
/*
5
6
*/