蛇形填数

练习:

南邮http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1094

 

 

/**

 * 让我们从1开始依次填写。设“笔”的坐标为(x,y),则一开始x=0,y=n-1,即第0行,第n-1列(别忘了行列的范围是0到n-1,没有第n列).

 * “笔”的移动轨迹是:下,左,上,右。总之,先是下,到不能填了为左,接着是上,最后是右。

 * “不能填”是指再走就出界了,或者再走就要走到以前填过的格子。如果我们把所有格子初始化为0,就能很方便地加以判断。

 */

#include<stdio.h>

#include<string.h>

#define MAXN 65

int arr[MAXN][MAXN];

int main() {

    int n, x, y, i, j, cn;

    while (~scanf("%d", &n)) {

        memset(arr, 0, sizeof(arr));

        cn = arr[x = 0][y = n - 1] = 1;

        while (cn < n * n) {

            while ((x + 1 < n) && (!arr[x + 1][y])) {

                arr[++x][y] = ++cn;

            }

            while ((y - 1 >= 0) && (!arr[x][y - 1])) {

                arr[x][--y] = ++cn;

            }

            while ((x - 1 >= 0) && (!arr[x - 1][y])) {

                arr[--x][y] = ++cn;

            }

            while ((y + 1 < n) && (!arr[x][y + 1])) {

                arr[x][++y] = ++cn;

            }

        }

        for (i = 0; i < n; i++) {

            for (j = 0; j < n; j++) {

                printf("%5d", arr[i][j]);

            }

            printf("\n");

        }

    }

    return 0;

}

 

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