CodeForces 525D Arthur and Walls :只包含点和星的矩阵,需要将部分星变成点使满足点组成矩形 : dfs+思维
关键点在于,什么时候需要改变?
注意到只有一个2*2的矩形里面只有一个星才需要改变这个星为点
只要想到这个这题就能各种姿势搜索了===
可以dfs,从可变矩形向四周拓展==
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 int xx[]={-1,-1,0,0}; 6 int yy[]={0,-1,0,-1}; 7 int n,m; 8 char s[2005][2005]; 9 int check(int x,int y) 10 { 11 int i,j,cnt=0; 12 if (x<0||y<0||x>=n-1||y>=m-1) return 0; 13 for (i=x;i<=x+1;i++) 14 for (j=y;j<=y+1;j++) 15 if (s[i][j]=='*') cnt++; 16 return cnt==1; 17 } 18 int dfs(int x,int y) 19 { 20 for (int tx=x;tx<=x+1;tx++) 21 for (int ty=y;ty<=y+1;ty++) 22 if (s[tx][ty]=='*'){ 23 s[tx][ty]='.'; 24 for (int i=0;i<4;i++) 25 if (check(tx+xx[i],ty+yy[i])){ 26 dfs(tx+xx[i],ty+yy[i]); 27 } 28 return 0; 29 } 30 } 31 int main() 32 { 33 int i,j; 34 scanf("%d%d",&n,&m); 35 for (i=0;i<n;i++) 36 scanf("%s",s[i]); 37 for (i=0;i<=n-2;i++) 38 for (j=0;j<=m-2;j++) 39 if (check(i,j)) dfs(i,j); 40 for (i=0;i<n;i++) printf("%s\n",s[i]); 41 return 0; 42 }