题目链接:http://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1908
题意:如果‘.‘被‘*‘围起来,就把‘.‘变为‘*‘。
分析:如果是‘*‘直接输出,如果是‘.‘ 则要对其搜索
如果四个方向都是封闭的,则可以改变。即w[i][j]=4;
如果查询的是‘*‘或者查询的是已被查询过的‘.‘ ,则记录上;
如果查询的是‘.‘而且没有查询标记过,则进行查询;
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 #include<queue> 6 #include<stdlib.h> 7 #include<map> 8 #include<cmath> 9 10 using namespace std; 11 12 #define N 50 13 #define INF 0x3f3f3f3f 14 15 char s[N][N]; 16 int w[N][N],b[N][N],n,m; 17 int dir[4][2]= { {1,0},{0,1},{-1,0},{0,-1} }; 18 19 int q(int x,int y) 20 { 21 int i; 22 23 b[x][y]=1; 24 for(i=0; i<4; i++) 25 { 26 int xx=x+dir[i][0]; 27 int yy=y+dir[i][1]; 28 if(xx>=0&&xx<n&&yy>=0&&yy<m&&(s[xx][yy]==‘*‘||b[xx][yy])) 29 w[x][y]++; 30 if(xx>=0&&xx<n&&yy>=0&&yy<m&&s[xx][yy]==‘.‘&&!b[xx][yy]) 31 { 32 if(q(xx,yy)==1) 33 w[x][y]++; 34 } 35 } 36 37 if(w[x][y]==4) 38 return 1; 39 return 0; 40 } 41 42 int main() 43 { 44 int T,k=1,i,j; 45 46 scanf("%d", &T); 47 48 while(T--) 49 { 50 memset(w,0,sizeof(w)); 51 52 scanf("%d %d", &n,&m); 53 54 for(i=0; i<n; i++) 55 scanf("%s", s[i]); 56 57 printf("Case %d:\n",k++); 58 59 for(i=0; i<n; i++) 60 { 61 for(j=0; j<m; j++) 62 { 63 if(s[i][j]==‘.‘) 64 { 65 memset(w,0,sizeof(w)); 66 memset(b,0,sizeof(b)); 67 68 if(q(i,j)==1) 69 s[i][j]=‘*‘; 70 } 71 72 printf("%c", s[i][j]); 73 } 74 printf("\n"); 75 } 76 } 77 return 0; 78 }
时间: 2024-10-10 23:47:00