[OpenJude]LGTB玩扫雷

题目描述

在一个n * m 的棋盘上,有位置上有雷(用“*” 表示),其他位置是空地(用“.” 表示)。

LGTB 想在每个空地上写下它周围8 个方向相邻的格子中有几个雷。

请帮助他输出写了之后的棋盘

输入输出格式

输入格式

第一行包含两个整数n, m 代表棋盘大小

接下来n 行,每行m 个字符,代表棋盘

1 n,m 1000

输出格式

输出包含n 行,每行m 个字符,代表LGTB 写了数字之后的棋盘

输入输出样例

输入样例1
3 3
*.*
...
*.*
输出样例1
*2*
242
*2*

思路

模拟

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;

int n,m;
int Map[1001][1001];
const int dx[]={-1,-1,-1, 0,0, 1,1,1};
const int dy[]={-1, 0, 1,-1,1,-1,0,1};

void Search(int x,int y)
{
    int ans=0;
    for(int i=0;i<8;i++)
    {
        int a=x+dx[i],b=y+dy[i];
        if(a>0 && a<=n && b>0 && b<=m &&Map[a][b]==-1)
            ans++;
    }
    Map[x][y]=ans;
}


int main()
{
    memset(Map,0,sizeof(Map));
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            char ch;
            cin>>ch;
            if(ch=='*')    Map[i][j]=-1;
            if(ch=='.')    Map[i][j]=0;
        }

    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            if(Map[i][j]==0)
                Search(i,j);

    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(Map[i][j]==-1)    cout<<'*';
            else    cout<<Map[i][j];
        }
        cout<<endl;
    }
}

results matching ""

    No results matching ""