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 }
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 }
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 }
浙公网安备 33010602011771号