蛇形填数

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

输入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

 

你可能感兴趣的:(蛇形填数)