POJ 2251 、3278 、 3279

三题均为简单搜索

POJ 2251:不能用DFS,必须用BFS,因为DFS必须维护最值,且要扫完,铁定TLE。

POJ 3278:注意 10000 0和0 10000这两组数据,两组数据不处理好,铁定RE,注意 k == n 这样的数据,如果不等于 0 铁定WA。。。别的没什么了,BFS即可。

POJ 3279:注意题目说的字典序根本不用考虑,只要是翻转次数最小即可,枚举第一排的所有情况,最多有2^15次方种,然后利用2~n行更新前排的即可,最后判断最后一行是否全文为0,如果是,看是否需要更新最值。

 

代码:

POJ 2251:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<queue>
 6 using namespace std;
 7 char mp[50][50][50];
 8 int s[50][50][50];
 9 int sum;
10 int ss;
11 int dp[6][3] = {1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1};
12 int vis[50][50][50];
13 struct st{
14         int x,y,z,t;
15 };
16 int  bfs(int sx,int sy,int sz,int L,int R,int C)
17 {
18         queue<st>que;
19         st f;
20         f.x = sx;
21         f.y = sy;
22         f.z = sz;
23         f.t = 0;
24         que.push(f);
25         vis[sx][sy][sz] = 1;
26         while(!que.empty())
27         {
28                 f= que.front();
29                 que.pop();
30                 st g;
31                 for(int i = 0;i < 6; i++ )
32                 {
33                         g.x = f.x + dp[i][0];
34                         g.y = f.y + dp[i][1];
35                         g.z = f.z + dp[i][2];
36                         g.t = f.t + 1;
37                         if(!vis[g.x][g.y][g.z]&&(s[g.x][g.y][g.z]==1||s[g.x][g.y][g.z]==2))
38                         {
39                                 que.push(g);
40                                 vis[g.x][g.y][g.z] = 1;
41                                 if(s[g.x][g.y][g.z]==2)
42                                         return g.t;
43                         }
44                 }
45         }
46         return -1;
47 }
48 
49 int main()
50 {
51     ios::sync_with_stdio(false);
52     int L,R,C;
53     int sx,sy,sz;
54     while(~scanf("%d%d%d",&L,&R,&C))
55     {
56             memset(vis,0,sizeof(vis));
57             memset(mp,0,sizeof(mp));
58             memset(s,0,sizeof(s));
59             getchar();
60             if(!L&&!R&&!C)
61                 break;
62             ss=0;
63             for(int i = 0;i < L;i++)
64             {
65                     for(int j = 0;j < R; j++ )
66                     {
67                             for(int k = 0; k < C ; k++)
68                             {
69                                     scanf("%c",&mp[i][j][k]);
70                                     if(mp[i][j][k]=='.')
71                                         s[i][j][k] = 1;
72                                     if(mp[i][j][k]=='#')
73                                         s[i][j][k] = 0;
74                                     if(mp[i][j][k]=='S')
75                                     {
76                                             sx=i;sy=j;sz=k;
77                                     }
78                                     if(mp[i][j][k]=='E')
79                                         s[i][j][k] = 2;
80 
81                             }
82                             getchar();
83                     }
84                     getchar();
85 
86             }
87             int temp = bfs(sx,sy,sz,L,R,C);
88             if(temp!=-1)
89                 cout<<"Escaped in "<<temp<<" minute(s)."<<endl;
90             else
91                 cout<<"Trapped!"<<endl;
92     }
93     return 0;
94 }
View Code

POJ 3278:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<queue>
 6 using namespace std;
 7 
 8 struct st{
 9         int x;
10         int t;
11 }f;
12 int vis[200000+50];
13 int bfs(int s,int e)
14 {
15         queue<st>que;
16         f.x = s;
17         f.t = 0;
18         que.push(f);
19         vis[s] = 1;
20         while(!que.empty())
21         {
22                 f = que.front();
23                 que.pop();
24                 for(int i = 0;i<3;i++)
25                 {
26                         st g;
27                         if(i==0&&f.x<=e){
28                         g.x = f.x+1;
29                         g.t = f.t + 1;}
30                         if(i==1&&f.x-1>=0)
31                         {
32                                 g.x = f.x-1;
33                                 g.t = f.t + 1;
34                         }
35                         if(i==2&&f.x<=e)
36                         {
37                                 g.x = f.x+f.x;
38                                 g.t = f.t +1;
39                         }
40                         if(!vis[g.x])
41                         {
42                                 vis[g.x] = 1;
43                                 que.push(g);
44                                 if(g.x==e)
45                                         return g.t;
46                         }
47                 }
48         }
49 }
50 
51 int main()
52 {
53         int n,k;
54         scanf("%d%d",&n,&k);
55         if(n==k)
56               cout<<"0"<<endl;
57         else if(n>k)
58                 cout<<n-k<<endl;
59         else
60         printf("%d\n",bfs(n,k));
61 }
View Code

POJ 3279:

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstdlib>
  4 #include <algorithm>
  5 #include <cstring>
  6 #include <cmath>
  7 #include <stack>
  8 #include <vector>
  9 #include <queue>
 10 #include <map>
 11 #include <set>
 12 #include <climits>
 13 #include <cassert>
 14 #define LL long long
 15 #define lson lo, mi, rt << 1
 16 #define rson mi + 1, hi, rt << 1 | 1
 17 
 18 using namespace std;
 19 const int maxn = 1000 + 10;
 20 const int inf = 0x3f3f3f3f;
 21 const double eps = 1e-8;
 22 const double pi = acos(-1.0);
 23 const double ee = exp(1.0);
 24 
 25 int mp[20][20];
 26 int vis[20][20];
 27 int mm[20][20];
 28 int mmmm[20][20];
 29 int ans[20][20];
 30 int sum ,mx,id;
 31 void solve(int n,int m)
 32 {
 33         for(int i = 1;i <= (1<<m);i++)//二进制枚举
 34         {
 35                         memset(mmmm,0,sizeof(mmmm));
 36                         for(int kk = 1;kk <= n;kk++)
 37                                 for(int tt = 1; tt <= m;tt++)
 38                                         mm[kk][tt] = mp[kk][tt];
 39                         for(int j=1; j <= m; j++)
 40                         {
 41                                 mmmm[1][m - j + 1 ] = (((i -1)>> (j-1))) & 1; //可以给第一行赋值左右情况
 42                                 if(mmmm[1][m-j+1])
 43                                 {
 44                                 mm[1][m-j+1]^=1;
 45                                 mm[2][m-j+1]^=1;
 46                                 if(m-j+2<=m) mm[1][m-j+2]^=1;
 47                                 if(m-j+1>=2) mm[1][m-j] ^=1;
 48                                 sum++;
 49                                 }
 50                         }
 51 
 52                         for(int t = 2;t<=n;t++)
 53                         {
 54                                 for(int v = 1;v <= m;v++)
 55                                 if(mm[t-1][v]==1)
 56                                 {
 57                                         mmmm[t][v] = 1;
 58                                         sum++;
 59                                         mm[t][v] ^= 1;
 60                                         mm[t-1][v] ^= 1;
 61                                         if(v>=2) mm[t][v-1] ^=1;
 62                                         if(v<=m-1) mm[t][v+1]^=1;
 63                                         if(t+1<=n) mm[t+1][v] ^= 1;
 64                                 } 
 65                         }
 66                         int  flag = 1;
 67                         for(int v = 1;v<=m;v++)
 68                                 if(mm[n][v])
 69                                         flag = 0;
 70 
 71                         if(flag){
 72                                 if(sum<mx)
 73                                 {
 74                                         for(int p = 1;p<=n;p++)
 75                                                 for(int q = 1;q<=m;q++)
 76                                                         ans[p][q] = mmmm[p][q];
 77                                         mx = sum;
 78                                         sum = 0;
 79                                         id = i;
 80                                 }
 81                         }
 82                         else
 83                                 sum = 0;
 84         }
 85 }
 86  int main()
 87  {
 88         int n,m;
 89         sum = 0;
 90         mx = 9999999;
 91         scanf("%d %d",&n,&m);
 92         for(int i = 1;i <= n;i++)
 93                 for(int j = 1; j <= m;j++)
 94                         scanf("%d",&mp[i][j]);
 95         solve(n,m);
 96         if(mx==9999999)
 97         printf("IMPOSSIBLE\n");
 98         else 
 99         for(int i = 1;i<=n;i++)
100         {
101                 for(int j = 1;j<=m;j++)
102                 {
103                         if(j!=1) printf(" ");
104                         printf("%d",ans[i][j]);
105                 }
106                 printf("\n");
107         }
108 
109  }
View Code

 

posted on 2015-08-05 15:03  小松song  阅读(255)  评论(0)    收藏  举报

导航