围棋
Description
小火山最近喜欢上了围棋。
对于围棋,其实小火山是一窍不通的。现在棋盘上,有很多小火山的棋子。 如果棋盘上有这样的一个位置, 那么这个位置也会变成小火山
的棋子;这样的位置是指小火山的棋子将该位置围起来。
现在,小火山想知道实际棋盘是什么样子的。 你快来帮帮他吧!
Input
输入第一行是一个整数T(T <= 30), 表示一共有T组数据。
每组数据,第一行为两个整数n, m(1 <= n, m <= 25), 随后一个n*m的矩阵代表棋盘,其中"."是代表没放棋子的位置, "*"代表小火山的棋子。
Output
对于每组数据输出一个n*m的棋盘, 代表实际的棋盘。
样例输入
2
3 3
***
*.*
***
4 4
.*..
*.*.
*.*.
.*..
样例输出
Case 1:
***
***
***
Case 2:
.*..
***.
***.
.*..
HINT
Source
哎呀,还是练少了吧,比赛的时候还沉不下心来,这个深搜一点也不难嘛
1.首先从边界下手,如果边界是'.'的话,就开始进行搜索,把其本身和周围的'.'用数组vis标记为1(表示访问过)
2.要知道深搜就是递归的过程,如果边界的周围是'.',同样此点也会向四周进行搜索
3.那么剩下的没被标记过的'.'就代表被包围的,就将其变成'*';
#include <cstdio> #include <cstring> #include <iostream> #include <cmath> #include<vector> #include<algorithm> using namespace std; typedef long long LL; const int maxn=110; const int INF=0x3f3f3f3f; char maps[maxn][maxn]; int vis[maxn][maxn]; int dir[4][2] = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}}; int m, n; void DFS(int x, int y) { vis[x][y]=1; for(int i=0; i<4; i++) { int nx=x+dir[i][0]; int ny=y+dir[i][1]; if(nx>=0&&nx<n&&ny>=0&&ny<m&&maps[nx][ny]=='.'&&!vis[nx][ny]) DFS(nx, ny); } } int main() { int T, cas=1; scanf("%d", &T); while(T--) { scanf("%d %d", &n, &m); for(int i=0; i<n; i++) scanf("%s", maps[i]); memset(vis, 0, sizeof(vis)); for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { if(i!=0&&j!=0&&i!=n-1&&j!=m-1)///如果不是边界直接跳过 continue; if(maps[i][j]=='.'&&!vis[i][j])///如果边界是'.'且没有被访问过 DFS(i, j); } } for(int i=0; i<n; i++) { for(int j=0; j<m; j++) if(maps[i][j]=='.'&&!vis[i][j])///没有被访问过的'.'(就是被'*'包围的)将其变成'*'; maps[i][j]='*'; } printf("Case %d: ", cas++); for(int i=0; i<n; i++) puts(maps[i]);///printf("%s ", maps[i]); } return 0; }