蛇形填数

练习:

南邮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;
}

 

posted @ 2012-10-17 15:14  qingyezhu  阅读(174)  评论(0)    收藏  举报