蛇形填数
题目描述:
给定一个 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 }