我试图了解扫雷问题:
问题陈述:
你玩过扫雷吗?这个可爱的小游戏附带了一个我们记不起来的特定操作系统。游戏的目标是找到所有地雷位于M×N场内的地方。游戏在一个正方形中显示一个数字,告诉你该广场附近有多少个地雷。每个正方形最多有八个相邻的正方形。左边的4×4字段包含两个地雷,每个地雷用“*”字符表示。如果我们用上面提示的数字表示相同的字段,我们最终得到右边的字段:
测试用例
我不明白这个问题。只是解释我的问题,以便我可以自己解决。请不要解释解决方案。
(我已经看过this problem和其他许多人都喜欢这样,但他们不是在谈论核心编程问题,而是游戏项目。)
答案 0 :(得分:1)
理论上,扫雷可以作为物体网格。当玩家使用任何物体时(在经典扫雷中)周围物体检查他们周围的物体并计算有多少被标记为我的物体。
答案 1 :(得分:1)
问题只是计算每个地图单元的相邻炸弹数量。游戏只显示已经挖出的粗细胞。
您只需计算附近地雷的数量......
输入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
有关更多信息/想法,请查看: