时间限制 | 11 秒/Second(s) | 内存限制 | 512512 兆字节/Megabyte(s) |
题目描述
输出一个回形方阵,具体可见样例
输入
一个整数n (0 < n < 10)
输出
一个方阵,每个数字的定宽为2
<pre>
C语言用printf("%2d",x)
C++用cout<<setw(2)<<x
</pre>
样例输入复制
8
样例输出复制
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 7 6 6 6 6 6 6 6 6 6 6 6 6 6 7 8 8 7 6 5 5 5 5 5 5 5 5 5 5 5 6 7 8 8 7 6 5 4 4 4 4 4 4 4 4 4 5 6 7 8 8 7 6 5 4 3 3 3 3 3 3 3 4 5 6 7 8 8 7 6 5 4 3 2 2 2 2 2 3 4 5 6 7 8 8 7 6 5 4 3 2 1 1 1 2 3 4 5 6 7 8 8 7 6 5 4 3 2 1 0 1 2 3 4 5 6 7 8 8 7 6 5 4 3 2 1 1 1 2 3 4 5 6 7 8 8 7 6 5 4 3 2 2 2 2 2 3 4 5 6 7 8 8 7 6 5 4 3 3 3 3 3 3 3 4 5 6 7 8 8 7 6 5 4 4 4 4 4 4 4 4 4 5 6 7 8 8 7 6 5 5 5 5 5 5 5 5 5 5 5 6 7 8 8 7 6 6 6 6 6 6 6 6 6 6 6 6 6 7 8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
#include<iostream>
#include <algorithm>
#include<cstring>
using namespace std;
int n;
int main()
{
cin >> n;
int m=n;
int a[2*n+1][2*n+1];
memset(a, 0, sizeof(a));
a[0][0] = n;
int flag=1;
int i=0,j=0;
int num=0;
int x=2*n+1,y=2*n+1,nx=0,ny=0;
while(true)
{
switch (flag)
{
case 1://自左向右
while(a[i][j+1]==0)
{
a[i][++j] = m;
if(j==y-1)
{
flag=2;
y--;
num++;
break;
}
}
break;
case 2://自上而下
while(a[i+1][j]==0)
{
a[++i][j] = m;
if(i==x-1)
{
flag=3;
x--;
num++;
break;
}
}
break;
case 3://自右向左
while(a[i][j-1]==0)
{
a[i][--j] = m;
if(j==ny)
{
flag=4;
ny++;
num++;
break;
}
}
break;
case 4://自下而上
while(a[i-1][j]==0)
{
a[--i][j] = m;
if(i==nx+1)
{
flag=1;
nx++;
num++;
break;
}
}
break;
}
if(num%4==0)m--;
if(num==4*n+1)break;
}
for(i=0;i<2*n+1;i++)
{
for(j=0;j<2*n+1;j++)
{
printf("%2d",a[i][j]);
}
cout << endl;
}
return 0;
}