33 蛇形填数

来源:互联网 发布:手机如何联系淘宝小二 编辑:程序博客网 时间:2024/05/01 00:01


蛇形填数

时间限制: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 16 9 25 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;}


0 0