HDU ACM 1045 Fire Net (深搜DFS)

http://acm.hdu.edu.cn/showproblem.php?pid=1045

 题意:题目给出一个n和一幅N*N的图,图中包含'.','X'两种字符,要求在上面放上碉堡,碉堡能攻击他所在的行和列,但不能攻击墙,求最多能放多少个碉堡.

 

开始每放一个,就把那一位置所在的行列标记,直到遇到墙或边界停止.     

这种方法很笨,但由于数据量小,也能AC.

View Code
  1 #include <iostream>
  2 using namespace std;
  3 const int MAX = 5;
  4 char map[MAX][MAX];
  5 int used[MAX][MAX];
  6 int n;
  7 int max1;
  8 void DFS(int rank)
  9 {
 10     int i,j;
 11     int mark = 0;
 12     for(i=1;i<=n;i++)
 13     {
 14         for(j=1;j<=n;j++)
 15         {
 16             if(used[i][j] == 0 && map[i][j] != 'X')
 17             {
 18                 mark = 1;
 19                 break;
 20             }
 21         }
 22         if(mark)
 23         {
 24             break;
 25         }
 26     }
 27 
 28 
 29     if(mark == 0)
 30     {
 31         if(max1 < rank)
 32         {
 33             max1 = rank;
 34         }
 35         return ;
 36     }
 37     for(i=1;i<=n;i++)
 38     {
 39         for(j=1;j<=n;j++)
 40         {
 41             if(map[i][j] != 'X' && used[i][j] == 0)
 42             {
 43                 int k;
 44 
 45                 for(k=j;k<=n;k++)
 46                 {
 47                     if(i>=1 && k>=1 && i<=n && k<=n && map[i][k] != 'X')
 48                     {
 49                         used[i][k]++;
 50                     }
 51                     else
 52                     {
 53                         break;
 54                     }
 55                 }
 56                 for(k=j;k>=1;k--)
 57                 {
 58                     if(i>=1 && k>=1 && i<=n && k<=n && map[i][k] != 'X')
 59                     {
 60                         used[i][k]++;
 61                     }
 62                     else
 63                     {
 64                         break;
 65                     }
 66                 }
 67                 for(k=i;k<=n;k++)
 68                 {
 69                     if(i>=1 && k>=1 && i<=n && k<=n && map[k][j] != 'X')
 70                     {
 71                         used[k][j]++;
 72                     }
 73                     else
 74                     {
 75                         break;
 76                     }
 77                 }
 78                 for(k=i;k>=1;k--)
 79                 {
 80                     if(i>=1 && k>=1 && i<=n && k<=n && map[k][j] != 'X')
 81                     {
 82                         used[k][j]++;
 83                     }
 84                     else
 85                     {
 86                         break;
 87                     }
 88                 }
 89 
 90 
 91                 DFS(rank+1);
 92 
 93 
 94                 for(k=j;k<=n;k++)
 95                 {
 96                     if(i>=1 && k>=1 && i<=n && k<=n && map[i][k] != 'X')
 97                     {
 98                         used[i][k]--;
 99                     }
100                     else
101                     {
102                         break;
103                     }
104                 }
105                 for(k=j;k>=1;k--)
106                 {
107                     if(i>=1 && k>=1 && i<=n && k<=n && map[i][k] != 'X')
108                     {
109                         used[i][k]--;
110                         
111                     }
112                     else
113                     {
114                         break;
115                     }
116                 }
117                 for(k=i;k<=n;k++)
118                 {
119                     if(i>=1 && k>=1 && i<=n && k<=n && map[k][j] != 'X')
120                     {
121                         used[k][j]--;
122                         
123                     }
124                     else
125                     {
126                         break;
127                     }
128                 }
129                 for(k=i;k>=1;k--)
130                 {
131                     if(i>=1 && k>=1 && i<=n && k<=n && map[k][j] != 'X')
132                     {
133                         used[k][j]--;
134                         
135                     }
136                     else
137                     {
138                         break;
139                     }
140                 }
141             }
142         }
143     }
144     return ;
145 }
146 int main()
147 {
148     while(cin>>n,n)
149     {
150         memset(map,0,sizeof(map));
151         memset(used,0,sizeof(used));
152         int i,j;
153         for(i=1;i<=n;i++)
154         {
155             for(j=1;j<=n;j++)
156             {
157                 cin>>map[i][j];
158             }
159         }
160         max1 = 0;
161         DFS(0);
162         cout<<max1<<endl;
163     }
164     return 0;
165 }

 

重新写了代码,改变思路.

把用过的位置标记为' @ '(记住还原) 然后递归,下一次遍历时向四个方向遍历(遍历一行或者一列),若找到'@' 则标记为 不行 若找到'X'或者边界则标记为 行

View Code
 1 #include <iostream>
 2 using namespace std;
 3 const int MAX = 6;
 4 int point[4][2] = {-1,0,0,-1,1,0,0,1};
 5 int n;
 6 char map[MAX][MAX];
 7 int max1;
 8 int judge(int mid_x,int mid_y)
 9 {
10     int i;
11     int mark = 1;
12     for(i=0;i<4;i++)
13     {
14         int x,y;
15         x = mid_x;
16         y = mid_y;
17         while(1)
18         {
19             x = x + point[i][0];
20             y = y + point[i][1];
21             if( map[x][y] == '@')
22             {
23                 mark = 0;
24                 break;
25             }
26             else
27             {
28                 if(map[x][y] == 'X')
29                 {
30                     break;
31                 }
32                 else
33                 {
34                     if(x<1 || y<1 || x>n || y>n)
35                     {
36                         break;
37                     }
38                 }
39             }
40         }
41     }
42     return mark;
43 }
44 
45 void DFS(int rank)
46 {
47     int i,j;
48     for(i=1;i<=n;i++)
49     {
50         for(j=1;j<=n;j++)
51         {
52             if(map[i][j] == '.' && judge(i,j))
53             {
54                 map[i][j] = '@';
55                 DFS(rank+1);
56                 map[i][j] = '.';
57             }
58         }
59     }
60     if(max1 < rank)
61     {
62         max1 = rank;
63     }
64     return ;
65 }
66 int main()
67 {
68     while(cin>>n,n)
69     {
70         memset(map,0,sizeof(map));
71         int i,j;
72         for(i=1;i<=n;i++)
73         {
74             for(j=1;j<=n;j++)
75             {
76                 cin>>map[i][j];
77             }
78         }
79         max1 = 0;
80         DFS(0);
81         cout<<max1<<endl;
82     }
83     return 0;
84 }

 

不过题目好像有问题,附加两个坑爹代码

超时代码

View Code
  1 #include <iostream>
  2 #include <vector>
  3 #include <queue>
  4 using namespace std;
  5 const int MAX = 5;
  6 char map[MAX][MAX];
  7 int used[MAX][MAX];
  8 int point[4][2] = {0,1,0,-1,1,0,-1,0};
  9 struct Node
 10 {
 11     int x;
 12     int y;
 13 };
 14 int n;
 15 int NUM;
 16 int num[1100];
 17 int mark2222[10000][10000];
 18 void DFS(int rank)
 19 {
 20     int i,j;
 21     int mark = 0;
 22     for(i=1;i<=n;i++)
 23     {
 24         for(j=1;j<=n;j++)
 25         {
 26             if(used[i][j] == 0 && map[i][j] != 'X')
 27             {
 28                 mark = 1;
 29                 break;
 30             }
 31         }
 32         if(mark)
 33         {
 34             break;
 35         }
 36     }
 37 
 38 
 39     if(mark == 0)
 40     {
 41         num[NUM++] = rank;
 42         return ;
 43     }
 44 
 45 
 46     for(i=1;i<=n;i++)
 47     {
 48         for(j=1;j<=n;j++)
 49         {
 50             if(map[i][j] != 'X' && used[i][j] == 0)
 51             {
 52                 int k;
 53 
 54                 for(k=j;k<=n;k++)
 55                 {
 56                     if(i>=1 && k>=1 && i<=n && k<=n && map[i][k] != 'X')
 57                     {
 58                         used[i][k]++;
 59                     }
 60                     else
 61                     {
 62                         break;
 63                     }
 64                 }
 65                 for(k=j;k>=1;k--)
 66                 {
 67                     if(i>=1 && k>=1 && i<=n && k<=n && map[i][k] != 'X')
 68                     {
 69                         used[i][k]++;
 70                     }
 71                     else
 72                     {
 73                         break;
 74                     }
 75                 }
 76                 for(k=i;k<=n;k++)
 77                 {
 78                     if(i>=1 && k>=1 && i<=n && k<=n && map[k][j] != 'X')
 79                     {
 80                         used[k][j]++;
 81                     }
 82                     else
 83                     {
 84                         break;
 85                     }
 86                 }
 87                 for(k=i;k>=1;k--)
 88                 {
 89                     if(i>=1 && k>=1 && i<=n && k<=n && map[k][j] != 'X')
 90                     {
 91                         used[k][j]++;
 92                     }
 93                     else
 94                     {
 95                         break;
 96                     }
 97                 }
 98 
 99 
100                 DFS(rank+1);
101 
102 
103                 for(k=j;k<=n;k++)
104                 {
105                     if(i>=1 && k>=1 && i<=n && k<=n && map[i][k] != 'X')
106                     {
107                         used[i][k]--;
108                     }
109                     else
110                     {
111                         break;
112                     }
113                 }
114                 for(k=j;k>=1;k--)
115                 {
116                     if(i>=1 && k>=1 && i<=n && k<=n && map[i][k] != 'X')
117                     {
118                         used[i][k]--;
119                         
120                     }
121                     else
122                     {
123                         break;
124                     }
125                 }
126                 for(k=i;k<=n;k++)
127                 {
128                     if(i>=1 && k>=1 && i<=n && k<=n && map[k][j] != 'X')
129                     {
130                         used[k][j]--;
131                         
132                     }
133                     else
134                     {
135                         break;
136                     }
137                 }
138                 for(k=i;k>=1;k--)
139                 {
140                     if(i>=1 && k>=1 && i<=n && k<=n && map[k][j] != 'X')
141                     {
142                         used[k][j]--;
143                         
144                     }
145                     else
146                     {
147                         break;
148                     }
149                 }
150             }
151         }
152     }
153     return ;
154 }
155 int main()
156 {
157     while(cin>>n,n)
158     {
159         memset(map,0,sizeof(map));
160         memset(used,0,sizeof(used));
161         memset(num,0,sizeof(num));
162         NUM = 0;
163         int i,j;
164         for(i=1;i<=n;i++)
165         {
166             for(j=1;j<=n;j++)
167             {
168                 cin>>map[i][j];
169             }
170         }
171         DFS(0);
172         int max = 0;
173         for(i=0;i<NUM;i++)
174         {
175             if(max < num[i])
176             {
177                 max = num[i];
178             }
179         }
180         cout<<max<<endl;
181     }
182     return 0;
183 }

加了一个二维数组声明 int mark2222[10000][10000]; 成了AC代码

View Code
  1 #include <iostream>
  2 #include <vector>
  3 #include <queue>
  4 using namespace std;
  5 const int MAX = 5;
  6 char map[MAX][MAX];
  7 int used[MAX][MAX];
  8 int point[4][2] = {0,1,0,-1,1,0,-1,0};
  9 struct Node
 10 {
 11     int x;
 12     int y;
 13 };
 14 int n;
 15 int NUM;
 16 int num[1100];
 17 int mark2222[10000][10000];//只有这里不同。。。。。。。。。。。。。。。。。。。。。。。
 18 void DFS(int rank)
 19 {
 20     int i,j;
 21     int mark = 0;
 22     for(i=1;i<=n;i++)
 23     {
 24         for(j=1;j<=n;j++)
 25         {
 26             if(used[i][j] == 0 && map[i][j] != 'X')
 27             {
 28                 mark = 1;
 29                 break;
 30             }
 31         }
 32         if(mark)
 33         {
 34             break;
 35         }
 36     }
 37 
 38 
 39     if(mark == 0)
 40     {
 41         num[NUM++] = rank;
 42         return ;
 43     }
 44 
 45 
 46     for(i=1;i<=n;i++)
 47     {
 48         for(j=1;j<=n;j++)
 49         {
 50             if(map[i][j] != 'X' && used[i][j] == 0)
 51             {
 52                 int k;
 53 
 54                 for(k=j;k<=n;k++)
 55                 {
 56                     if(i>=1 && k>=1 && i<=n && k<=n && map[i][k] != 'X')
 57                     {
 58                         used[i][k]++;
 59                     }
 60                     else
 61                     {
 62                         break;
 63                     }
 64                 }
 65                 for(k=j;k>=1;k--)
 66                 {
 67                     if(i>=1 && k>=1 && i<=n && k<=n && map[i][k] != 'X')
 68                     {
 69                         used[i][k]++;
 70                     }
 71                     else
 72                     {
 73                         break;
 74                     }
 75                 }
 76                 for(k=i;k<=n;k++)
 77                 {
 78                     if(i>=1 && k>=1 && i<=n && k<=n && map[k][j] != 'X')
 79                     {
 80                         used[k][j]++;
 81                     }
 82                     else
 83                     {
 84                         break;
 85                     }
 86                 }
 87                 for(k=i;k>=1;k--)
 88                 {
 89                     if(i>=1 && k>=1 && i<=n && k<=n && map[k][j] != 'X')
 90                     {
 91                         used[k][j]++;
 92                     }
 93                     else
 94                     {
 95                         break;
 96                     }
 97                 }
 98 
 99 
100                 DFS(rank+1);
101 
102 
103                 for(k=j;k<=n;k++)
104                 {
105                     if(i>=1 && k>=1 && i<=n && k<=n && map[i][k] != 'X')
106                     {
107                         used[i][k]--;
108                     }
109                     else
110                     {
111                         break;
112                     }
113                 }
114                 for(k=j;k>=1;k--)
115                 {
116                     if(i>=1 && k>=1 && i<=n && k<=n && map[i][k] != 'X')
117                     {
118                         used[i][k]--;
119                         
120                     }
121                     else
122                     {
123                         break;
124                     }
125                 }
126                 for(k=i;k<=n;k++)
127                 {
128                     if(i>=1 && k>=1 && i<=n && k<=n && map[k][j] != 'X')
129                     {
130                         used[k][j]--;
131                         
132                     }
133                     else
134                     {
135                         break;
136                     }
137                 }
138                 for(k=i;k>=1;k--)
139                 {
140                     if(i>=1 && k>=1 && i<=n && k<=n && map[k][j] != 'X')
141                     {
142                         used[k][j]--;
143                         
144                     }
145                     else
146                     {
147                         break;
148                     }
149                 }
150             }
151         }
152     }
153     return ;
154 }
155 int main()
156 {
157     while(cin>>n,n)
158     {
159         memset(map,0,sizeof(map));
160         memset(used,0,sizeof(used));
161         memset(num,0,sizeof(num));
162         NUM = 0;
163         int i,j;
164         for(i=1;i<=n;i++)
165         {
166             for(j=1;j<=n;j++)
167             {
168                 cin>>map[i][j];
169             }
170         }
171         DFS(0);
172         int max = 0;
173         for(i=0;i<NUM;i++)
174         {
175             if(max < num[i])
176             {
177                 max = num[i];
178             }
179         }
180         cout<<max<<endl;
181     }
182     return 0;
183 }

 明显是杭电数据有问题。。。

posted @ 2012-08-30 20:25  zx雄  阅读(2367)  评论(0编辑  收藏  举报