您的位置:首页 > 编程语言 > PHP开发

problem.php?id=1044

2016-08-18 21:38 513 查看
问题 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

,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数圈