kuangbin带你飞 专题一
http://poj.org/problem?id=1321
深搜一遍
1 #include<stdio.h> 2 #include<string.h> 3 char mp[10][10],flag[10]; 4 int n,m,ans; 5 6 void dfs(int x,int an9) 7 { 8 if(an9==m){ 9 ans++; 10 return ; 11 } 12 for(int i=x;i<n;i++){ 13 for(int j=0;j<n;j++){ 14 if(mp[i][j]==‘#‘&&flag[j]==0){ 15 flag[j]=1; 16 dfs(i+1,an9+1); 17 flag[j]=0; 18 } 19 } 20 } 21 } 22 int main() 23 { 24 //freopen( "in.txt", "r", stdin); 25 while( ~scanf("%d%d",&n,&m)){ 26 if(n==-1&&m==-1) break; 27 for(int i=0;i<n;i++) 28 scanf("%s",mp[i]); 29 ans=0; 30 memset( flag, 0, sizeof flag); 31 for(int i=0;i<n;i++){ 32 for(int j=0;j<n;j++){ 33 if(mp[i][j]==‘#‘){ 34 flag[j]=1; 35 dfs(i+1,1); 36 flag[j]=0; 37 } 38 } 39 } 40 printf("%d\n",ans); 41 } 42 return 0; 43 }
http://poj.org/problem?id=2251
广搜一遍(代码后面再改改)
1 #include<stdio.h> 2 #include<string.h> 3 #include<queue> 4 #include<algorithm> 5 using namespace std; 6 #define Max 36 7 char mp[Max][Max][Max]; 8 int L,R,C,ans,ex,ey,ez; 9 int moz[]={0,0,0,0,1,-1}; 10 int moy[]={0,0,1,-1,0,0}; 11 int mox[]={1,-1,0,0,0,0}; 12 int flag[Max][Max][Max]; 13 14 bool cheat(int x, int y, int z) 15 { 16 if(x>0&&y>0&&z>0&&x<=L&&y<=R&&z<=C&&flag[x][y][z]==0&&(mp[x][y][z]==‘.‘||mp[x][y][z]==‘E‘)){ 17 return true; 18 } 19 return false; 20 } 21 typedef struct P{int x,y,z;}; 22 void bfs(int opx,int opy,int opz,int anp) 23 { 24 queue<P> op; 25 P p,q; 26 p.x=opx,p.y=opy,p.z=opz; 27 flag[opx][opy][opz]=1; 28 op.push(p); 29 while(!op.empty()){ 30 int tim=op.size(); 31 p=op.front(); 32 op.pop(); 33 if(mp[p.x][p.y][p.z]==‘E‘){ 34 ans=anp; 35 break; 36 } 37 for(int i=0;i<6;i++){ 38 int x,y,z; 39 x=p.x+mox[i]; 40 y=p.y+moy[i]; 41 z=p.z+moz[i]; 42 if(cheat(x,y,z)){ 43 flag[x][y][z]=1; 44 q.x=x; 45 q.y=y; 46 q.z=z; 47 op.push(q); 48 } 49 } 50 while(--tim){ 51 p=op.front(); 52 op.pop(); 53 if(mp[p.x][p.y][p.z]==‘E‘){ 54 ans=anp; 55 break; 56 } 57 for(int i=0;i<6;i++){ 58 int x,y,z; 59 x=p.x+mox[i]; 60 y=p.y+moy[i]; 61 z=p.z+moz[i]; 62 if(cheat(x,y,z)){ 63 flag[x][y][z]=1; 64 q.x=x; 65 q.y=y; 66 q.z=z; 67 op.push(q); 68 } 69 } 70 } 71 anp++; 72 } 73 } 74 75 int main() 76 { 77 // freopen( "in.txt", "r", stdin); 78 while( ~scanf("%d%d%d",&L,&R,&C)){ 79 if(L==0&&R==0&&C==0) break; 80 int bx,by,bz; 81 memset( flag, 0, sizeof flag); 82 for(int i=1;i<=L;i++){ 83 getchar(); 84 for(int j=1;j<=R;j++){ 85 for(int k=1;k<=C;k++){ 86 scanf("%c",&mp[i][j][k]); 87 if(mp[i][j][k]==‘S‘){ 88 bx=i,by=j,bz=k; 89 } 90 if(mp[i][j][k]==‘E‘){ 91 ex=i,ey=j,ez=k; 92 } 93 } 94 getchar(); 95 } 96 } 97 // printf("%d %d %d\n",ex,ey,ez); 98 ans=1e7; 99 bfs(bx,by,bz,0); 100 if(ans!=1e7){ 101 printf("Escaped in %d minute(s).\n",ans); 102 } 103 else{ 104 printf("Trapped!\n"); 105 } 106 } 107 return 0; 108 }
http://poj.org/problem?id=3278
广搜
1 #include<stdio.h> 2 #include<math.h> 3 #include<string.h> 4 #include<stdlib.h> 5 #include<queue> 6 using namespace std; 7 #define Max 100006 8 using namespace std; 9 int n,en,ans; 10 int flag[Max]; 11 12 void bfs(int op) 13 { 14 queue<int> q; 15 q.push(op); 16 flag[op]=1; 17 int fi=0; 18 while(!q.empty()){ 19 int iop,num; 20 num=q.size(); 21 while(num--){ 22 iop=q.front(); 23 q.pop(); 24 int x,y,z; 25 x=iop+1; 26 y=iop*2; 27 z=iop-1; 28 if(x==en||y==en||z==en){ 29 fi=1; 30 break; 31 } 32 if(!flag[x]){ 33 q.push(x); 34 flag[x]=1; 35 } 36 if(y<Max&&!flag[y]){ 37 q.push(y); 38 flag[y]=1; 39 } 40 if(z>0&&!flag[z]){ 41 q.push(z); 42 flag[z]=1; 43 } 44 } 45 ans++; 46 if(fi==1) 47 break; 48 } 49 } 50 51 int main() 52 { 53 while( ~scanf("%d%d",&n,&en)){ 54 memset( flag, 0, sizeof flag); 55 if(n>=en){ 56 printf("%d\n",n-en); 57 continue; 58 } 59 ans=0; 60 bfs(n); 61 printf("%d\n",ans); 62 } 63 return 0; 64 }