kuangbin带你飞 专题一
http://poj.org/problem?id=1321
深搜一遍
1 #include2 #include 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
http://poj.org/problem?id=2251
广搜一遍(代码后面再改改)
1 #include2 #include 3 #include 4 #include 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 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 #include2 #include 3 #include 4 #include 5 #include 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 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 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 }
http://poj.org/problem?id=1426
题意:要求找出n的倍数,并且只含有0/1.
思路:从1开始进行广搜,每次入队*10与*10+1,遇到%n==0时结束搜索。
注意大数,因此用longlong。
1 #include2 #include 3 #define ll long long 4 using namespace std; 5 int n; 6 7 void bfs() 8 { 9 queue op;10 op.push(1);11 int k=1;12 ll ans=0;13 for(int i=1;;i++){14 for(int j=1;j<=k;j++){15 ans=op.front();16 op.pop();17 if(ans%n==0){18 printf("%lld\n",ans);19 return ;20 }21 ans *=10;22 op.push(ans); op.push(ans+1);23 }24 k*=2;25 }26 }27 28 int main()29 {30 while( ~scanf("%d",&n)){31 if(!n) break;32 bfs();33 }34 return 0;35 }
http://poj.org/problem?id=3126
题意:输入两个数,n,m。都是四位数,要求从n到m,而且每次变化都要是素数。
思路:把1000到10000的素数存进set,把每一位数提取出来,逐一变化。
发现素数不会找,上网查了一下筛法求素数,惭愧qwq。貌似还有更加简便的sprintf.........
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 const int maxm=10006; 7 set prime; 8 bool num[maxm],flag[maxm]; 9 int fir[5];10 11 void pri()12 {13 prime.clear();14 memset( num, false, sizeof num);15 num[0]=num[1]=1;16 for(int i=2;i