算是比较简单吧,但觉得代码很优美,遂写下

输入N,显示效果如下:

 

学到:1.循环的安排形式  2.预判(试探),即先看看下个位置是否越界,是否填过,先看看,而不是先跳到那位置再看行不行,因为后悔就麻烦了!

 

#include <iostream>
#include <cstring>

#define N 4
int A[N][N];

int main(void)
{
    memset(A,0,sizeof(A));

    int total=1,x=0,y=N-1;
    A[x][y]=total;

    while (total<N*N)   //total为刚刚填好的格子里面的值,所以当total=N*N时,全部填好
    {
        while ((x+1<N)&&(A[x+1][y]==0))  //试探,下一个没有超出边界并且下一个没有填写过
        {
            x++,total++;  //跳到下一个,并且确定那里面的值
            A[x][y]=total;   //填值
        }  //这个结束后,坐标在最后填的那个格子里面,且total的值是那个格子里面的值
        while ((y-1>=0)&&(A[x][y-1]==0))
        {
            y--,total++;
            A[x][y]=total;
        }
        while ((x-1>=0)&&(A[x-1][y]==0))
        {
            x--,total++;
            A[x][y]=total;
        }
        while ((y+1<N)&&(A[x][y+1]==0))
        {
            y++,total++;
            A[x][y]=total;
        }
    }

    using std::endl;
    using std::cin;
    using std::cout;
    using std::ios_base;
    cout.setf(ios_base::left,ios_base::adjustfield);  //左对齐

    for (int i=0;i<N;i++)
    {
        for (int j=0;j<N;j++)
        {
            cout.width(3);   //显示宽度,只影响一个......
            cout<<A[i][j]<<" ";
        }
        cout<<endl;
    }

    cin.get();
    return 0;
}
View Code

 

posted on 2013-12-07 13:47  简单的信仰  阅读(303)  评论(0编辑  收藏  举报