蛇形填数: 在n×n方阵里填入1,2,....,n×n,要求填成蛇形。例如,n = 4 时方阵为:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
上面的方阵中,多余的空格只是为了便于观察规律,不必严格输出。n <= 8 。
类比上面这种数学中的矩阵,我们可以考虑使用一个二维数组来储存。
解题思路:从右上角开始往下填数,当到底的时候转向左填值,当到左边的边的时候转向上填数,当到最上面的时候转向右填值...依次类推。第一轮转圈的判断条件很简单,就是当横坐标小于行数、纵坐标小于列数的时候。但是这样循环下去当到第二轮循环的时候就会把第一轮的数值覆盖,即一直在最外面的一圈循环下去(当把数值填够之后停止)。我们可以这样解决这个问题:起始把数组置成零,然后在判断转向的时候加上&&非下一个位置上的值即可。
以下是具体解题的代码:
1 #include <stdio.h> 2 #define maxn 8 3 int a[maxn][maxn]; 4 int main() 5 { 6 int i, j; 7 for(i = 0; i < maxn; i++) 8 { 9 for(j = 0; j < maxn; j++) 10 a[i][j] = 0; 11 } 12 a[0][maxn-1] = 1; 13 j = maxn-1; 14 i = 0; 15 int count = 1;/*---------思考下面为什么是错误的??? 16 while(count < maxn*maxn) 17 { 18 while(i+1 < maxn && !a[++i][j]) a[i][j] = ++count; 19 while(j-1 >= 0 && !a[i][--j]) a[i][j] = ++count; 20 while(i-1 >= 0 && !a[--i][j]) a[i][j] = ++count; 21 while(j+1 < maxn && !a[i][++j]) a[i][j] = ++count; 22 }*/////初学者最容易犯的错误:忽略i++和i+1是不一样的! 23 while(count < maxn*maxn) //① 24 { 25 while(i+1 < maxn && !a[i+1][j]) a[++i][j] = ++count; //② 26 while(j-1 >= 0 && !a[i][j-1]) a[i][--j] = ++count; 27 while(i-1 >= 0 && !a[i-1][j]) a[--i][j] = ++count; 28 while(j+1 < maxn && !a[i][j+1]) a[i][++j] = ++count; 29 } 30 for(i = 0; i < maxn; i++) 31 { 32 for(j = 0; j < maxn; j++) 33 printf("%3d ",a[i][j]); 34 printf("\n"); 35 } 36 return 0; 37 }
有兴趣的码友可以考虑一下:
1、①处为什么不是count <= maxn*maxn ;
2、②处为什么
1 #include <stdio.h> 2 #define maxn 8 3 int a[maxn][maxn]; 4 int main() 5 { 6 int i, j; 7 for(i = 0; i < maxn; i++) 8 { 9 for(j = 0; j < maxn; j++) 10 a[i][j] = 0; 11 } 12 a[0][maxn-1] = 1; 13 j = maxn-1; 14 i = 0; 15 int count = 1;/*---------思考下面为什么是错误的??? 16 while(count < maxn*maxn) 17 { 18 while(i+1 < maxn && !a[++i][j]) a[i][j] = ++count; 19 while(j-1 >= 0 && !a[i][--j]) a[i][j] = ++count; 20 while(i-1 >= 0 && !a[--i][j]) a[i][j] = ++count; 21 while(j+1 < maxn && !a[i][++j]) a[i][j] = ++count; 22 }*/////初学者最容易犯的错误:忽略i++和i+1是不一样的! 23 while(count < maxn*maxn) //① 24 { 25 while(i+1 < maxn && !a[i+1][j]) a[++i][j] = ++count; //② 26 while(j-1 >= 0 && !a[i][j-1]) a[i][--j] = ++count; 27 while(i-1 >= 0 && !a[i-1][j]) a[--i][j] = ++count; 28 while(j+1 < maxn && !a[i][j+1]) a[i][++j] = ++count; 29 } 30 for(i = 0; i < maxn; i++) 31 { 32 for(j = 0; j < maxn; j++) 33 printf("%3d ",a[i][j]); 34 printf("\n"); 35 } 36 return 0; 37 }
不是 count++ ;
3、②处可不可以改成 while(i+1 < maxn && !a[i++][j]) a[i][j] = ++count ;
欢迎码友评论,谢谢支持。
时间: 2024-11-06 03:46:55