了解扫雷程序编程 p.roblem

understanding the minesweeper programming p.roblem

我正在尝试了解扫雷问题:
问题陈述:
你玩过扫雷吗?这个可爱的小游戏带有特定的操作系统,我们不记得它的名字了。游戏的目标是找出 M × N 区域内所有地雷的位置。游戏在一个方块中显示一个数字,告诉您该方块附近有多少地雷。每个方格最多有八个相邻的方格。左边的 4×4 区域包含两个地雷,每个地雷都用“*”字符表示。如果我们用上面描述的提示数字表示相同的字段,我们最终会得到右边的字段:
The test case

我不明白这个问题。只需向我解释问题,以便我自己解决。请不要解释解决方案。

(我已经看到this problem和很多其他类似的但他们不是在谈论核心编程问题,它们是游戏项目。)

理论上扫雷可以做成物体的网格。当玩家使用任何物体时(在经典扫雷游戏中)周围的物体会检查 THEIR 周围的物体 并计算有多少被标记为我的。

问题只是计算每个地图单元格中相邻炸弹的数量。游戏只显示已经挖出的粗细胞

您只需数一下附近的地雷数量...

  1. 输入char map[5][5]样本

    .....
    .*...
    ...*.
    .....
    *....
    
  2. 创建一个计数器int cnt[5][5]

    它应该与输入 map 具有相同的大小。用 0

    初始化它
     map   cnt
    ..... 00000
    .*... 00000
    ...*. 00000
    ..... 00000
    *.... 00000
    
  3. 遍历整个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