题目描述
雷被标记为'*';
点开的空白区域标记为'0';
未点开的空白区域标记为'.';
数字1~8代表周围有多少雷;
kirai非常笨,他希望你帮他完成这样的任务:
给定k(1≤k≤min(可扫位置数, 10))个位置坐标和扫雷游戏的后台数据,输出点开指定位置序列后游戏的结果,初始时游戏中没有点开任何位置。
注:数据保证扫雷过程中不会重复点击已扫位置。
输入描述:
输入样例有多组,全部是正整数。首先输入样例组数T(T≤10)。i
接下来输入T组数,每组数据第一行包括四个正整数n,m,k(1≤n, m≤500, 1≤k≤min(可扫位置数, 10))分别表示地图的行、列数和即将点开的位置数。紧接着是一个n*m的矩阵,代表扫雷的后台数据,。
矩阵后是k个整数对x
, yi
(1≤i≤k, 1≤xi
≤n, 1≤yi
≤m),表示依次点开的位置。
输出描述:
如果某一步踩到雷,输出"Game over in step x"(不包括引号",表示第x步踩中雷);未踩到雷则根据扫雷的游戏规则更新,并输出最后一步结束后显示给kirai的矩阵。
输入
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; }