题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=3529
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 242 Accepted Submission(s): 112
30 | zyzamp | 78MS | 204K | 2228B | C++ | 2011-08-07 20:10:14 |
1 //Problem : 3529 ( Bomberman - Just Search! ) Judge Status : Accepted
2 //RunId : 4355959 Language : C++ Author : zhuyawei
3 //Code Render Status : Rendered By HDOJ C++ Code Render Version 0.01 Beta
4 # include<stdio.h>
5 # include<string.h>
6 # define N 200
7 # define V 900
8 int n,m,size,ak;
9 int U[V],D[V];
10 int L[V],R[V];
11 int C[V];
12 int H[N],S[N];
13 int visit[17][17];
14 int rr,cc;//表示0-1矩阵的行和列
15 char map[17][17];
16 void Link(int r,int c)
17 {
18 S[c]++;C[size]=c;
19 U[size]=U[c];D[U[c]]=size;
20 D[size]=c;U[c]=size;
21 if(H[r]==-1) H[r]=L[size]=R[size]=size;
22 else
23 {
24 L[size]=L[H[r]];R[L[H[r]]]=size;
25 R[size]=H[r];L[H[r]]=size;
26 }
27 size++;
28 }
29 void remove(int c)
30 {
31 int i;
32 for(i=D[c];i!=c;i=D[i])
33 L[R[i]]=L[i],R[L[i]]=R[i];
34 }
35 void resume(int c)
36 {
37 int i;
38 for(i=U[c];i!=c;i=U[i])
39 L[R[i]]=R[L[i]]=i;
40 }
41 int h()
42 {
43 int i,j,k,count=0;
44 bool hash[N];
45 memset(hash,0,sizeof(hash));
46 for(i=R[0];i;i=R[i])
47 {
48 if(hash[i]) continue;
49 hash[i]=1;
50 count++;
51 for(j=D[i];j!=i;j=D[j])
52 for(k=R[j];k!=j;k=R[k])
53 hash[C[k]]=1;
54 }
55 return count;
56 }
57 void Dance(int k)
58 {
59 int i,j,Min,c;
60 if(h()+k>=ak) return;
61 if(!R[0])
62 {
63 if(k<ak) ak=k;
64 return;
65 }
66 for(Min=N,i=R[0];i;i=R[i])
67 if(Min>S[i]) Min=S[i],c=i;
68 for(i=D[c];i!=c;i=D[i])
69 {
70 remove(i);
71 for(j=R[i];j!=i;j=R[j])
72 remove(j);
73 Dance(k+1);
74 for(j=L[i];j!=i;j=L[j])
75 resume(j);
76 resume(i);
77 }
78 }
79 int main()
80 {
81 int i,j,k1,k2;
82 while(scanf("%d%d",&n,&m)!=EOF)
83 {
84 cc=0;
85 memset(visit,0,sizeof(visit));
86 for(i=0;i<n;i++)
87 {
88 scanf("%s",map[i]);
89 for(j=0;map[i][j];j++)
90 if(map[i][j]=='#') visit[i][j]=++cc;
91 }
92 for(i=0;i<=cc;i++)
93 {
94 S[i]=0;
95 D[i]=U[i]=i;
96 L[i+1]=i;R[i]=i+1;
97 }R[cc]=0;
98 size=cc+1;
99 memset(H,-1,sizeof(H));
100 rr=0;
101 for(i=1;i<n-1;i++)
102 {
103 for(j=1;j<m-1;j++)
104 if(map[i][j]=='.')
105 {
106 rr++;
107 k1=i-1;k2=j;
108 while(map[k1][k2]=='.') k1--;
109 if(map[k1][k2]=='#') Link(rr,visit[k1][k2]);
110
111 k1=i+1;k2=j;
112 while(map[k1][k2]=='.') k1++;
113 if(map[k1][k2]=='#') Link(rr,visit[k1][k2]);
114
115 k1=i;k2=j-1;
116 while(map[k1][k2]=='.') k2--;
117 if(map[k1][k2]=='#') Link(rr,visit[k1][k2]);
118
119 k1=i;k2=j+1;
120 while(map[k1][k2]=='.') k2++;
121 if(map[k1][k2]=='#') Link(rr,visit[k1][k2]);
122 //分别向四个方向进行搜索
123 }
124 }
125 ak=N;
126 Dance(0);
127 printf("%d\n",ak);
128 }
129 return 0;
130 }