problem.php?id=1044

问题 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;
}

猜你喜欢

转载自blog.csdn.net/qithon/article/details/52245170