问题 1044. – 数圈
1044: 数圈
时间限制: 1 Sec 内存限制: 128 MB提交: 243 解决: 105
[ 提交][ 状态][ 讨论版]
题目描述
以1为中心,用2,3,4, …, n, …, n*n的数字围绕着中心输出数圈, 如若n=4,则
7 8 9 10
6 1 2 11
5 4 3 12
16 15 14 13
输入
一个整数n(1<=n<=10)
输出
数圈矩阵
样例输入
5
样例输出
21 22 23 24 25
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13
提示
来源
解决方法:
以下是我写的代码。
#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
const int N=20;
int main()
{
int n,i,j,tp,ts,tw,flag;
cin>>n;
int a[N][N],cnt=1;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
a[i][j]=0;
a[N/2][N/2]=1;
i=N/2;j=N/2;
while(cnt!=n*n)
{
tp=(int)sqrt(cnt);
if(tp*tp==cnt)// 1,4,9,16这些值对应的坐标
{
ts=cnt;
tw=tp;
if(tp%2!=0) //若为奇数,则向右移动
{
a[i][j+1]=cnt+1;
j=j+1;
flag=4;
}
else//否则向左移动
{
a[i][j-1]=cnt+1;
j=j-1;
flag=3;
}
}
else if(ts+1==cnt)//若为上述点后的第一个点
{
if(tw%2==0)//为偶数则向上移动
{
a[i-1][j]=cnt+1;
i=i-1;
flag=1;
}
else//否则向下移动
{
a[i+1][j]=cnt+1;
i=i+1;
flag=2;
}
}
else if(cnt==(tw+1)*(tw+1)-tw)//若为靠近下一个平方点的四边顶点
{
if((tw+1)%2==0)//若下一个平方点开方为偶数,则向左移动
{
a[i][j-1]=cnt+1;
j=j-1;
flag=3;
}
else//否则向右移动
{
a[i][j+1]=cnt+1;
j=j+1;
flag=4;
}
}
else//处理非四周顶点情况
{
if(flag==1)//若上一个点是向上移动,则继续向上移动
{
a[i-1][j]=cnt+1;
i=i-1;
}
else if(flag==2) //若上一个点是向下移动,则继续向下移动
{
a[i+1][j]=cnt+1;
i=i+1;
}
else if(flag==3)//若上一个点是向左移动,则继续向左移动
{
a[i][j-1]=cnt+1;
j=j-1;
}
else //若上一个点是向右移动,则继续向右移动
{
a[i][j+1]=cnt+1;
j=j+1;
}
}
cnt++;
}
bool qp=false;
for(i=0;i<N;i++)
{
if(qp) break;
for(j=0;j<N;j++)
if(a[i][j]!=0)
{
ts=i;
tw=j;
qp=true;
break;
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n-1;j++)
{
cout<<a[ts+i][tw+j]<<" ";
}
cout<<a[ts+i][tw+n-1]<<endl;
}
return 0;
}