备战蓝桥-the second question

[问题描述]

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。

输出的时候是地雷直接输出*,否则输出标记的数组。

#include<iostream>
#include<cstring>
#include<string>
using namespace std;
#define maxn 1005
char map[maxn][maxn];
int f[maxn][maxn];
int main()
{
    int n,m;
    int kase = 1;
    while(~scanf("%d %d",&n,&m))
    {
        if(n==0&&m==0)
            break;
        for(int i = 1; i <= n; i ++)
            for(int j = 1; j <= m; j ++)
        {
            cin>>map[i][j];
            if(map[i][j]=='*')
            {
                for(int p = -1; p < 2; p ++)
                    for(int q = -1; q < 2; q ++)
                        f[i+p][j+q]++;
            }
        }
        printf("Field #%d:\n",++kase);
         for(int i = 1; i <= n; i ++)
        {
            for(int j = 1; j <= m; j ++)
            {
                if(map[i][j]=='*')
                    printf("*");
                else
                    printf("%d",f[i][j]);
            }
            printf("\n");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值