(NOIP2015第二题)扫雷(mine)

来源:互联网 发布:java内嵌机制 编辑:程序博客网 时间:2024/06/08 01:20

2. 扫雷游戏

(mine.cpp/c/pas)

  扫雷游戏是一款十分经典的单机小游戏。在 n行 m 列的雷区中有一些格子含有地雷

(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。

现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。

注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。

 

【输入格式】

输入文件名为 mine.in。

 输入文件第一行是用一个空格隔开的两个整数n和m,分别表示雷区的行数和列数。

接下来 n行,每行m 个字符,描述了雷区中的地雷分布情况。字符’*’表示相应格子是地雷格,字符’?’表示相应格子是非地雷格。相邻字符之间无分隔符。

 

【输出格式】

 输出文件名为 mine.out。

 输出文件包含 n 行,每行 m 个字符,描述整个雷区。用’*’表示地雷格,用周围的地雷个数表示非地雷格。相邻字符之间无分隔符。

 

【输入输出样例 1】

mine.in

mine.out

3 3

*??

???

?*?

 

*10

221

1*1

 

见选手目录下的 mine/mine1.in和 mine/mine1.ans。

【输入输出样例 2】

mine.in

mine.out

2 3

?*?

*??

 

2*1

*21

 

见选手目录下的 mine/mine2.in和 mine/mine2.ans。

【输入输出样例 3】

见选手目录下的 mine/mine3.in和 mine/mine3.ans。

 

【数据说明】  对于 100%的数据,1≤n≤100,1≤m≤100。


不难看出,根据范围,这是一道二维数组的问题。

好了,这又是一道对于刚学二维数组的萌新很难,对于某些大神很简单的题……

算法如下(算法中有些细节作者在下面会讲):

1.输入n,m。做个双重循环,外层1到n,里层1到m。(外层m,里层n也是一样的)

2.每次输入一个字符(不是字符串,就是字符)如果这个字符是‘*’,把当前a【i,j】置为-1(a是二维数组),并在四周找不是-1的数,找到一个,把那个不是-1的数加1

3.将a输出

这里讲一些细节,为了优化,作者没有为了输入多弄一个字符型数组,而是直接把判断和输入放在了一起。

判断四周,也就是判断a【i-1,j-1】a【i-1, j】a [i-1,j+1] a [i,j-1] a[i,j+1]……等等。

有细心的盆友会说,这里会越界,所以我们把数组设到0到101乘0到101就可以了,这样就免了特殊值判断。

另外,把a【i,j】置为-1就是为了表示这是炸弹。

 程序如下:

var
  a:array[0..101,0..101] of integer;
  b:char;
  i,j,l,n,m,x,y,h:longint;
begin
  assign(input,'mine.in');
  reset(input);
  assign(output,'mine.out');
  rewrite(output);
  readln(n,m);
  for x:=1 to n do
    begin
      for y:=1 to m do
        begin
          read(b);
          if b='*'
             then begin
                  a[x,y]:=-1;
                  for l:=-1 to 1 do
                    begin
                      for j:=-1 to 1 do
                        begin
                          if a[x+l,y+j]<>-1
                             then inc(a[x+l,y+j]);
                        end;
                    end;
                  end;
        end;
      readln;
    end;
  for i:=1 to n do
    begin
      for j:=1 to m do
        begin
          if a[i,j]=-1
             then write('*')
              else write(a[i,j]);
        end;
      writeln;
    end;
  close(input);
  close(output);
end.

原创粉丝点击