了解扫雷编程p.roblem

时间:2016-10-14 14:19:36

标签: algorithm core

我试图了解扫雷问题:
问题陈述:
你玩过扫雷吗?这个可爱的小游戏附带了一个我们记不起来的特定操作系统。游戏的目标是找到所有地雷位于M×N场内的地方。游戏在一个正方形中显示一个数字,告诉你该广场附近有多少个地雷。每个正方形最多有八个相邻的正方形。左边的4×4字段包含两个地雷,每个地雷用“*”字符表示。如果我们用上面提示的数字表示相同的字段,我们最终得到右边的字段:
测试用例
here is the test case

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

(我已经看过this problem和其他许多人都喜欢这样,但他们不是在谈论核心编程问题,而是游戏项目。)

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

您只需计算附近地雷的数量......

  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
    
  4. 有关更多信息/想法,请查看: