Mineweep(扫雷)

Posted dgwblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mineweep(扫雷)相关的知识,希望对你有一定的参考价值。

题目描述:

每周一题之2  Mineweep(扫雷)

 

Minesweeper (扫雷)

PC/UVa IDs: 110102/10189,

Popularity: A,

Success rate: high Level: 1

 

测试地址:https://vjudge.net/problem/UVA-10189

 

[问题描述]

Have you ever played Minesweeper? It’s a cute little game which comes within a certain Operating

System which name we can’t really remember. Well, the goal of the game is to find where are all the mines within a M × N field. To help you, the game shows a number in a square which tells you how many mines there are adjacent to that square. For instance, supose the following 4 × 4 field with 2 mines (which are represented by an ‘*’ character):

*...

....

.*..

....

If we would represent the same field placing the hint numbers described above, we would end up

with:

*100

2210

1*10

1110

As you may have already noticed, each square may have at most 8 adjacent squares.

 

[输入]

The input will consist of an arbitrary number of fields. The first line of each field contains two integers

n and m (0 < n, m ≤ 100) which stands for the number of lines and columns of the field respectively.

The next n lines contains exactly m characters and represent the field.

Each safe square is represented by an ‘.’ character (without the quotes) and each mine square

is represented by an ‘*’ character (also without the quotes). The first field line where n = m = 0

represents the end of input and should not be processed.

 

下面这段话蓝桥官方误导:

[输出]

对于每对整数 i 和 j,按原来的顺序输出 i 和 j,然后输出二者之间的整数中的最大循环节长度。这三个整数应该用单个空格隔开,且在同一行输出。对于读入的每一组数据,在输出中应位于单独的一行。

 

 

[样例输入]

4 4

*...

....

.*..

....

3 5

**...

.....

.*...

0 0

 

[样例输出]

Field #1:

*100

2210

1*10

1110

 

Field #2:

**100

33200

1*100

*/

 

解析: 

1.处理好边界:

2. 遍历每个点的每个方向,操作结课

 

 

技术分享图片

AC代码:

 

package december.year18;

import java.util.Scanner;

public class Solution2 {

    static int [] x={0,0,1,-1,1,-1,-1,1};
    static int [] y={1,-1,0,0,1,-1,1,-1};
    
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int cindex=1;
        while (in.hasNext()) {
            int n = in.nextInt();
            int m = in.nextInt();
            if(m==0&&m==n) {
                return;
            }
            char[][] mat = new char[n][];

            for (int i = 0; i < mat.length; i++) {
                mat[i]=in.next().toCharArray();
            }
            
            int mL=mat[0].length;
            for (int i = 0; i < mat.length; i++) {
                for (int j = 0; j < mL; j++) {
                    if(mat[i][j]!=‘*‘) {
                        for (int k = 0; k < 8; k++) {
                            int newx=i+x[k];
                            int newy=j+y[k];
                            if(newx>=0&&newy>=0&&newx<n&&newy<mL) {
                                if(mat[newx][newy]==‘*‘) {
                                    if(mat[i][j]==‘.‘) {
                                        mat[i][j]=‘0‘;
                                    }
                                    mat[i][j]++;
                                }
                            }
                        }
                    }
                }
            }
            if(cindex>1)System.out.println();
            System.out.println("Field #"+cindex+":");
            cindex++;
            for (int i = 0; i < mat.length; i++) {
                for (int j = 0; j < mat[i].length; j++) {
                        if(mat[i][j]==‘.‘) {
                            System.out.print(‘0‘);
                        }else {
                            System.out.print(mat[i][j]);
                        }
                }
                System.out.println();
            }
        }
    }

}

 

以上是关于Mineweep(扫雷)的主要内容,如果未能解决你的问题,请参考以下文章

急求C语言编译的小游戏(如扫雷),附带源代码和注释。

扫雷?拿来吧你!

C语言实现扫雷(初阶)

c语言期中项目实战二—扫雷递归版,思路分析+代码注释

C语言实现扫雷游戏(一步步教你如何写扫雷)

原生 JavaScript 实现扫雷 (分析+代码实现)