博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
蛇形填数
阅读量:4216 次
发布时间:2019-05-26

本文共 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/

你可能感兴趣的文章
Linux文件和设备编程
查看>>
文件描述符
查看>>
终端驱动程序:几个简单例子
查看>>
HTML条件注释
查看>>
内核态与用户态
查看>>
趣链 BitXHub跨链平台 (4)跨链网关“初介绍”
查看>>
C++ 字符串string操作
查看>>
MySQL必知必会 -- 了解SQL和MySQL
查看>>
MySQL必知必会 -- 数据检索
查看>>
MySQL必知必会 -- 排序检索数据 ORDER BY
查看>>
POJ 3087 解题报告
查看>>
POJ 2536 解题报告
查看>>
POJ 1154 解题报告
查看>>
POJ 1661 解题报告
查看>>
POJ 1101 解题报告
查看>>
ACM POJ catalogues[转载]
查看>>
C/C++文件操作[转载]
查看>>
常见的排序算法
查看>>
hdu 3460 Ancient Printer(trie tree)
查看>>
KMP求前缀函数(next数组)
查看>>