2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛 F扫雷

链接:https://www.nowcoder.com/acm/contest/118/F
来源:牛客网

扫雷
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述


《扫雷》是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。当某个位置为数字的时,代表它周围的八连通区域中有对应数量的雷。
kirai获取了简化版扫雷(没有标记雷的小旗)的后台数据(后台数据包括所有数字和雷的位置),转换为一个n*m(1≤n, m≤500)的矩阵并对格子类型做了如下标记:
雷被标记为'*';
点开的空白区域标记为'0';
未点开的空白区域标记为'.';
数字1~8代表周围有多少雷;
kirai非常笨,他希望你帮他完成这样的任务:
给定k(1≤k≤min(可扫位置数, 10))个位置坐标和扫雷游戏的后台数据,输出点开指定位置序列后游戏的结果,初始时游戏中没有点开任何位置。
注:数据保证扫雷过程中不会重复点击已扫位置。

输入描述:

输入样例有多组,全部是正整数。首先输入样例组数T(T≤10)。
接下来输入T组数,每组数据第一行包括四个正整数n,m,k(1≤n, m≤500, 1≤k≤min(可扫位置数, 10))分别表示地图的行、列数和即将点开的位置数。紧接着是一个n*m的矩阵,代表扫雷的后台数据,。
矩阵后是k个整数对x
i
, y
i
(1≤i≤k, 1≤x
i
≤n, 1≤y
i
≤m),表示依次点开的位置。

输出描述:

如果某一步踩到雷,输出"Game over in step x"(不包括引号",表示第x步踩中雷);未踩到雷则根据扫雷的游戏规则更新,并输出最后一步结束后显示给kirai的矩阵。
示例1

输入

1
5 5 3
2*11*
*2111
22...
*1...
11...
1 1
3 3
1 2

输出

Game over in step 3

说明

2....
.....
.....
.....
.....
2....
.2111
.2000
.1000
.1000
Game over in step 3

模拟题,遇到数字,就让数字显示出来,遇到'.',就要dfs把周围是'.'的都显示为‘0’,四周为数字,也要显示
详见代码注释
#include
#include
#include<string>
#include
#include 
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
char a[505][505];
char e[505][505];//用来显示
bool v[505][505];
int n,m,k;
int d[8][2]={{-1,0},{1,0},{0,1},{0,-1},{-1,1},{1,-1},{1,1},{-1,-1}};
void dfs(int x,int y)
{
    e[x][y]='0';
    for(int i=0;i<8;i++)
    {
        int xx=x+d[i][0];
        int yy=y+d[i][1];
        if(xx<1||yy<1||xx>n||yy>m) continue;
        if(a[xx][yy]=='*') continue;
        if(!v[xx][yy]&&a[xx][yy]=='.')
        {
            v[xx][yy]=1;//做好标记,以防回退
            dfs(xx,yy);
        }
        else if(a[xx][yy]=='1'||a[xx][yy]=='2'||a[xx][yy]=='3'||a[xx][yy]=='4'||a[xx][yy]=='5'||a[xx][yy]=='6'||a[xx][yy]=='7'||a[xx][yy]=='8')
        {
            e[xx][yy]=a[xx][yy];
        }
    }
}



int main()
{
    int t;
    cin>>t;
    while(t--)
    {

        cin>>n>>m>>k;
        memset(v,0,sizeof(v));
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                cin>>a[i][j];
                e[i][j]='.';
            }
        }
        bool f=1;
        for(int p=1;p<=k;p++)
        {
            int x,y;
            cin>>x>>y;
            if(!f) continue;
            if(a[x][y]=='*')
            {
                f=0;
                cout<<"Game over in step "<endl;
                continue;//还要让它继续输入的
            }
            if(a[x][y]=='.')
            {
                if(v[x][y]==1) continue;
                v[x][y]=1;
                dfs(x,y);//扫周边8个方向

            }
            else if(a[x][y]=='1'||a[x][y]=='2'||a[x][y]=='3'||a[x][y]=='4'||a[x][y]=='5'||a[x][y]=='6'||a[x][y]=='7'||a[x][y]=='8')
            {
                e[x][y]=a[x][y];
            }
        }
        if(f)
        {
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=m;j++)
                {
                    cout<<e[i][j];
                }
                cout<<endl;
            }
        }
    }
    return 0;
}
    
 
         

 

 

你可能感兴趣的:(2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛 F扫雷)