本文共 1148 字,大约阅读时间需要 3 分钟。
例:在n*n的方阵中 填入 1,2.....n*n,要求填成蛇形。例如2*2矩阵:
4 1
3 2
实现:
#include#include #define max 30int a[max][max];int main() { int n; memset(a,0,sizeof(a));// freopen("C:\\Users\\zhangwei\\Desktop\\input.txt","r",stdin);// freopen("C:\\Users\\zhangwei\\Desktop\\output.txt","w",stdout); scanf("%d",&n); int cnt = 1; a[0][n-1] = 1;//下面循环解决不了第一个数 int i = 0, j = n-1; while(cnt < n*n){//以4*4为例 当 ++cnt == 15时候 满足条件 进入 循环 因为 内部是 ++cnt == 16 故 此时就不满足循环了 刚好出来 while(i + 1 < n && !a[i+1][j]) a[++i][j] = ++cnt; while(j-1 >= 0 && !a[i][j-1]) a[i][--j] = ++cnt;//j-1属于预判断因为 j-1 就是后面的[--j] 只有 j-1后满足条件 才可以继续后面 while(i-1 >= 0 && !a[i-1][j]) a[--i][j] = ++cnt; while(j + 1 < n && !a[i][j+1]) a[i][++j] = ++cnt; } for(int i = 0; i < n; i++ ){ for(int j = 0; j < n; j++ ){ printf("%5d",a[i][j]); } printf("\n"); } return 0; }
这题 主要是 对数组中 ++I 与 I++的理解
此题用前置++ 而不用后置++ 因为 后置(i++) (以4*4第一遍的右侧为例)当 I = 3时 a[I++] 后 填上了a[3]后 i变成 4 此时已经越界,并且 这也不便进行预判断 是否 有的位置已经被填充。
而用 前置(++i) 每次都是先进行预判断 后 如果没越界 才可以进入循环 进行填充 这就保证了 不会越界 例如 (以4*4第一遍的右侧为例)当I = 2, 满足2+1 < (n = 4), a[++i] 也就是 a[3] 填入数字,但是
下一次循环就不再满足, 此时 I的值 仍然为 3 这正是我们期望的。
转载地址:http://paimi.baihongyu.com/