蛇形填数
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
在n*n方陈里填入1,2,...,n*n,要求填成蛇形。例如n=4时方陈为:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
-
输入
- 直接输入方陈的维数,即n的值。(n<=100) 输出
- 输出结果是蛇形方陈。 样例输入
-
3
样例输出
-
7 8 1 6 9 2 5 4 3
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
int n,i,j,x,y,l,num;
int nn[100][100];
while(cin>>n)
{
x=0;y=n-1;l=n-1;num=1; //x,y为坐标,l为每次移动的长度,num为当前位置填的数
for(i=0;i<ceil(n/2);i++)//有几圈就循环几次
{
for(j=0;j<l;j++)
{
nn[x][y]=num;
num++;
x++;
} //从右上角向下移动(从每圈右上角开始)
for(j=0;j<l;j++)
{
nn[x][y]=num;
num++;
y--;
} //从右下角向左移动
for(j=0;j<l;j++)
{
nn[x][y]=num;
num++;
x--;
} //从左下角向上移动
for(j=0;j<l;j++)
{
nn[x][y]=num;
num++;
y++;
} //从左上角向右移动(回到每圈最开始的位置,即右上角)
x++;y--;l-=2; //x+,y-使坐标往左下移动一位,到达下一圈的左上角。每圈都比它外面的那一圈少两行,所以l每次减2
}
if(n%2==1) nn[n/2][n/2]=n*n; //当n为单数时,上述循环无法将最中心的位置赋值,所以添加本句
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(j==0) cout<<nn[i][j];
else cout<<' '<<nn[i][j];
}
cout<<endl;
}
}
return 0;
}