第12页 扫雷第二
- 章节名:扫雷第二
- 页码:第12页
二维数组的基本使用。为了更易读,下标从1开始计数。 算法是:对于每一个不是雷的点,统计其周围8个点的雷数,记录在二维数组对应的元素中。打印该二维数组。 具体的实现上,采用char二维数组,因为雷点数最多为8,用char表示绰绰有余。非雷的'.'替换为‘0’,在其周围找到一个雷点就对该元素+1,这样最后的值是'0'到'8'之间的字符,而雷点依然为'*',就可以打印字符二维数组了。 注意点:注意下标要在范围之内。最后一次输出之后没有空行,否则会PE。 代码如下:
#include <stdio.h> char field[101][102]; int main(int argc, const char **argv) { int n, m; int i, j; int n_start, n_stop; int m_start, m_stop; int k, l; int fields = 0; while ((scanf("%d %d\n", &n, &m)) != EOF && (n | m) != 0) { if (fields > 0) putchar('\n'); for (i = 1; i < n + 1; i++) { for (j = 1; j < m + 2; j++) field[i][j] = getchar(); } for (i = 1; i < n + 1; i++) for (j = 1; j < m + 1; j++) { if (field[i][j] == '*') continue; field[i][j] = '0'; n_start = i > 1 ? i - 1 : 1; n_stop = i < n ? i + 1: n; m_start = j > 1 ? j - 1 : 1; m_stop = j < m ? j + 1: m; for (k = n_start; k <= n_stop; k++) for (l = m_start; l <= m_stop; l++) if (field[k][l] == '*') field[i][j]++; } fields++; printf("Field #%d:\n", fields); for (i = 1; i < n + 1; i++) for (j = 1; j < m + 2; j++) putchar(field[i][j]); } return 0; }
14人阅读
轶名对本书的所有笔记 · · · · · ·
-
第11页 3n+1问题第一
这个是开头题目,比较简单。一次性通过。 注意点:没有说明i和j的大小关系,程序里要检查。 ...
-
第12页 扫雷第二
-
第13页 旅行第三
这个比第二题难度大,题意较难透彻地理解。WA了好久。结果发现,Programming-challenges上对...
-
第14页 液晶显示屏第四
这个同属二维数组的应用,但比扫雷问题难。 扫雷是数组下标对应行和列,元素值对应内容,这都...
> 查看全部15篇
说明 · · · · · ·
表示其中内容是对原文的摘抄