牛客~~扫雷~~~DFS+模拟

Posted buerdepepeqi

tags:

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

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

题目描述

技术分享图片
《扫雷》是一款大众类的益智小游戏,于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
根据题意模拟,记得初始化
技术分享图片
#include<cstdio>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
char mp[505][505];
char t[505][505];
bool vis[505][505];
int d[8][2]={{-1,0},{1,0},{0,1},{0,-1},{-1,1},{1,-1},{1,1},{-1,-1}};
int n,m,k;
void init() {
    for(int i =1; i<=n; i++) {
        for(int j=1; j<=m; j++) {
            t[i][j]=.;
        }
    }
}
void dfs(int x,int y) {
    t[x][y]=0;
    for(int i=0; i<8; i++) {
            int nx=x+d[i][0];
            int ny=y+d[i][1];
            if(nx<1||ny<1||nx>n||ny>m) continue;
            if(mp[nx][ny]==*) continue;
            if(!vis[nx][ny]&&mp[nx][ny]==.) {
                vis[nx][ny]=1;
                dfs(nx,ny);
            } else if(mp[x][y]>=1&&mp[x][y]<=8) {
                t[nx][ny]=mp[nx][ny];
            }
        }
}
int main() {
    int T;
    scanf("%d",&T);
    while(T--) {

        memset(vis,0,sizeof(vis));
        scanf("%d%d%d",&n,&m,&k);
        init();
        for(int i=1; i<=n; i++) {
            for(int j=1; j<=m; j++) {
                cin>>mp[i][j];
            }
        }
        int flag=1;
        for(int i=1; i<=k; i++) {
            int x,y;
            scanf("%d%d",&x,&y);
            if(!flag) continue;
            if(mp[x][y]==*) {
                flag=0;
                printf("Game over in step %d\n",i);
                continue;
            }
            if(mp[x][y]==.) {
                if(vis[x][y]==1) continue;
                vis[x][y]=1;
                dfs(x,y);
            } else if(mp[x][y]>=1&&mp[x][y]<=8) {
                t[x][y]=mp[x][y];
            }
        }
        if(flag) {
            for(int i=1; i<=n; i++) {
                for(int j=1; j<=m; j++) {
                    printf("%c",t[i][j]);
                }
                printf("\n");
            }
        }
    }
    return 0;
}
View Code

 














以上是关于牛客~~扫雷~~~DFS+模拟的主要内容,如果未能解决你的问题,请参考以下文章

扫雷真题dfs(2022蓝桥杯)

牛客白月赛31题解

牛客网Nowcoder 牛客练习赛13 A.幸运数字Ⅰ B.幸运数字Ⅱ(数组或者dfs) C.幸运数字Ⅲ(思维)

NC13223牛客二星DFS

牛客装货物(dfs)

2021牛客多校9 E.Eyjafjalla(dfs序+主席树)