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 }
View Code

题目链接:http://codeforces.com/contest/525/problem/D

posted on 2015-03-27 15:24  xiao_xin  阅读(140)  评论(0编辑  收藏  举报

导航