蛇形填数

题目描述:
给定一个 n , 在  n * n 的方阵中填入 1 ,2, 3,……,n * n,  要求填成蛇形。
例如在 n = 5 时 , 如下所示:
13   14   15   16   1
12   23   24   17   2
11   22   25   18   3
10   21   20   19   4
  9     8     7     6   5
 
思路如下:
涉及到行与列,用二维数组解这道题。首先将坐标写出(x,y),将二维数组初始化全部成0,方便判断移动时是否越界。
第一个坐标位置为(0,n-1),即第0行,第n-1列。蛇形数如果N=5时,先是下下下下、左左左左、上上上上、右右右、
下下下、左左、上上、右、下即可完成蛇形填数。总之先是下,到不能填为止,然后是左、上、右。不能填即指再移动
就出界或下一个值非0。
 
 1 #include <stdio.h>
 2 #include <string.h>
 3 #define maxn 20
 4 int main()
 5 {
 6     int a[maxn][maxn];
 7     int n;
 8     int x,y;
 9     int total=0;
10     printf("input a number:");
11     scanf("%d",&n);
12     memset(a,0,sizeof(a)); //将二维数组初始化为0
13     total=a[x=0][y=n-1]=1;
14     
15     while (total<n*n)
16     {
17         while (x+1<n&&!a[x+1][y]) //x+1判断下一步移动是否越界
18         {
19             a[++x][y]=++total;  // ++total;++x;a[x][y]=total;
20         }
21         while (y-1>=0&&!a[x][y-1])
22         {
23             a[x][--y]=++total;
24         }
25         while (x-1>=0&&!a[x-1][y])
26         {
27             a[--x][y]=++total;
28         }
29         while (y+1<n&&!a[x][y+1])
30         {
31         a[x][++y]=++total;
32         }
33     }   
34     for (int x = 0; x <n; x++)
35     {
36         for ( y = 0; y<n; y++)
37         {
38             printf("%3d",a[x][y]);
39         }
40         printf("\n");
41     }
42     
43         return 0;
44 }

 

posted @ 2019-09-18 17:33  秦朝掷弹兵  阅读(248)  评论(0编辑  收藏  举报