蛇形填数
时间限制:
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
注:此题为:NYOJ 33 蛇形填数
思路: 按顺序模拟坐标位置,找出循环规律,关键在于每一圈的循环结束条件
已AC代码:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int p[120][120];
int main()
{
int n;
while(cin>>n)
{
int i,j,temp,s;
s=1;
i=0;
j=n; //从(1,n)位置开始 (第0行和第0列不使用)
temp=0; //圈数
while(s<=n*n)
{
for(i+=1;i<=n-temp;++i) //向下
p[i][j]=s++;
i--;
for(j-=1;j>temp;--j) //向左
p[i][j]=s++;
j++;
for(i-=1;i>temp;--i) //向上
p[i][j]=s++;
i++;
temp++;
for(j+=1;j<=n-temp;++j) //向右
p[i][j]=s++;
j--;
}
for(i=1;i<=n;++i)
{
for(j=1;j<=n;++j)
cout<<p[i][j]<<" ";
cout<<endl;
}
}
return 0;
}
另一种蛇形填数(仅供参考):和上面差不多,先从(1,1)开始:
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int p[120][120];
int main()
{
int n;
while(cin>>n)
{
int i,j,temp,s;
i=s=1;
temp=j=0; //从(1,1)位置开始 (第0行和第0列不使用)
while(s<=n*n)
{
for(j+=1;j<=n-temp;++j) //向右
p[i][j]=s++;
j--;
for(i+=1;i<=n-temp;++i) //向下
p[i][j]=s++;
i--;
temp++;
for(j-=1;j>=temp;--j) //向左
p[i][j]=s++;
j++;
for(i-=1;i>temp;--i) //向上
p[i][j]=s++;
i++;
}
for(i=1;i<=n;++i)
{
for(j=1;j<=n;++j)
printf("%3d",p[i][j]);
cout<<endl;
}
}
return 0;
}