了解扫雷程序编程 p.roblem
understanding the minesweeper programming p.roblem
我正在尝试了解扫雷问题:
问题陈述:
你玩过扫雷吗?这个可爱的小游戏带有特定的操作系统,我们不记得它的名字了。游戏的目标是找出 M × N 区域内所有地雷的位置。游戏在一个方块中显示一个数字,告诉您该方块附近有多少地雷。每个方格最多有八个相邻的方格。左边的 4×4 区域包含两个地雷,每个地雷都用“*”字符表示。如果我们用上面描述的提示数字表示相同的字段,我们最终会得到右边的字段:
The test case
我不明白这个问题。只需向我解释问题,以便我自己解决。请不要解释解决方案。
(我已经看到this problem和很多其他类似的但他们不是在谈论核心编程问题,它们是游戏项目。)
理论上扫雷可以做成物体的网格。当玩家使用任何物体时(在经典扫雷游戏中)周围的物体会检查 THEIR 周围的物体 并计算有多少被标记为我的。
问题只是计算每个地图单元格中相邻炸弹的数量。游戏只显示已经挖出的粗细胞
您只需数一下附近的地雷数量...
输入char map[5][5]
样本
.....
.*...
...*.
.....
*....
创建一个计数器int cnt[5][5]
它应该与输入 map
具有相同的大小。用 0
初始化它
map cnt
..... 00000
.*... 00000
...*. 00000
..... 00000
*.... 00000
遍历整个map
如果 map[i][j]=='*'
则只需增加 cnt
中的所有相邻计数器,例如:
for (i=0;i<5;i++)
for (j=0;j<5;j++)
if (map[i][j]=='*')
{
cnt[i-1][j-1]++;
cnt[i-1][j ]++;
cnt[i-1][j+1]++;
cnt[i ][j-1]++;
cnt[i ][j+1]++;
cnt[i+1][j-1]++;
cnt[i+1][j ]++;
cnt[i+1][j+1]++;
}
为避免访问冲突您应该添加范围检查或分隔内部和边界部分。您还可以使用从每一侧放大 1 个单元格的数组大小,并仅使用内部部分。
条件每次成功的结果迭代:
map cnt
..... 11100
.*... 10100
...*. 11100
..... 00000
*.... 00000
..... 11100
.*... 10211
...*. 11201
..... 00111
*.... 00000
..... 11100
.*... 10211
...*. 11201
..... 11111
*.... 01000
更多info/ideas请看:
- Mine sweep in Turbo cpp
我正在尝试了解扫雷问题:
问题陈述:
你玩过扫雷吗?这个可爱的小游戏带有特定的操作系统,我们不记得它的名字了。游戏的目标是找出 M × N 区域内所有地雷的位置。游戏在一个方块中显示一个数字,告诉您该方块附近有多少地雷。每个方格最多有八个相邻的方格。左边的 4×4 区域包含两个地雷,每个地雷都用“*”字符表示。如果我们用上面描述的提示数字表示相同的字段,我们最终会得到右边的字段:
The test case
我不明白这个问题。只需向我解释问题,以便我自己解决。请不要解释解决方案。
(我已经看到this problem和很多其他类似的但他们不是在谈论核心编程问题,它们是游戏项目。)
理论上扫雷可以做成物体的网格。当玩家使用任何物体时(在经典扫雷游戏中)周围的物体会检查 THEIR 周围的物体 并计算有多少被标记为我的。
问题只是计算每个地图单元格中相邻炸弹的数量。游戏只显示已经挖出的粗细胞
您只需数一下附近的地雷数量...
输入
char map[5][5]
样本..... .*... ...*. ..... *....
创建一个计数器
int cnt[5][5]
它应该与输入
初始化它map
具有相同的大小。用0
map cnt ..... 00000 .*... 00000 ...*. 00000 ..... 00000 *.... 00000
遍历整个
map
如果
map[i][j]=='*'
则只需增加cnt
中的所有相邻计数器,例如:for (i=0;i<5;i++) for (j=0;j<5;j++) if (map[i][j]=='*') { cnt[i-1][j-1]++; cnt[i-1][j ]++; cnt[i-1][j+1]++; cnt[i ][j-1]++; cnt[i ][j+1]++; cnt[i+1][j-1]++; cnt[i+1][j ]++; cnt[i+1][j+1]++; }
为避免访问冲突您应该添加范围检查或分隔内部和边界部分。您还可以使用从每一侧放大 1 个单元格的数组大小,并仅使用内部部分。
条件每次成功的结果迭代:
map cnt ..... 11100 .*... 10100 ...*. 11100 ..... 00000 *.... 00000 ..... 11100 .*... 10211 ...*. 11201 ..... 00111 *.... 00000 ..... 11100 .*... 10211 ...*. 11201 ..... 11111 *.... 01000
更多info/ideas请看:
- Mine sweep in Turbo cpp