题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1252
题意都读了半天,orz...
给出n个结点,每两个结点之间都有一个线路想通,不过有不同的颜色,然后给三个piece,分别在三个初始位置,piece移动的条件是通过的路径的颜色必须要与另外两个piece所在位置之间的路径颜色想同,求使三个点移动到同一个位置上所需要的最小步数……
开个三位数组记录一下状态就好了,简单bfs.
View Code
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 using namespace std; 6 #define MAXN 55 7 struct Node{ 8 int x,y,z; 9 int step; 10 }; 11 int n,x,y,z; 12 char map[MAXN][MAXN]; 13 bool mark[MAXN][MAXN][MAXN]; 14 15 bool bfs(){ 16 queue<Node>Q; 17 Node p,q; 18 memset(mark,false,sizeof(mark)); 19 p.x=x,p.y=y,p.z=z,p.step=0; 20 mark[p.x][p.y][p.z]=true; 21 Q.push(p); 22 while(!Q.empty()){ 23 p=Q.front(); 24 Q.pop(); 25 if(p.x==p.y&&p.x==p.z){ 26 printf("%d\n",p.step); 27 return true; 28 } 29 for(int i=1;i<=n;i++){ 30 if(map[p.x][i]==map[p.y][p.z]&&!mark[i][p.y][p.z]){ 31 mark[i][p.y][p.z]=true; 32 q.x=i,q.y=p.y,q.z=p.z,q.step=p.step+1; 33 Q.push(q); 34 } 35 if(map[p.y][i]==map[p.x][p.z]&&!mark[p.x][i][p.z]){ 36 mark[p.x][i][p.z]=true; 37 q.x=p.x,q.y=i,q.z=p.z,q.step=p.step+1; 38 Q.push(q); 39 } 40 if(map[p.z][i]==map[p.x][p.y]&&!mark[p.x][p.y][i]){ 41 mark[p.x][p.y][i]=true; 42 q.x=p.x,q.y=p.y,q.z=i,q.step=p.step+1; 43 Q.push(q); 44 } 45 } 46 } 47 return false; 48 } 49 50 51 int main(){ 52 while(scanf("%d",&n),n){ 53 scanf("%d%d%d",&x,&y,&z); 54 for(int i=1;i<=n;i++) 55 for(int j=1;j<=n;j++) 56 scanf(" %c",&map[i][j]); 57 if(!bfs()) 58 puts("impossible"); 59 } 60 return 0; 61 }
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1484
思路:这道题主要就是处理墙的问题,我们可以记录每个网格的四个方向是否有墙存在,这个只需在输入墙的时候处理一下就行了,然后就是一般的bfs了。
View Code
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<queue> 6 #include<string> 7 using namespace std; 8 #define MAXN 9 9 struct Node{ 10 int x,y; 11 string path; 12 }; 13 14 struct Edge{ 15 bool N,S,W,E; 16 }map[MAXN][MAXN];//记录每一个格子的四周是否可以走 17 18 bool mark[MAXN][MAXN]; 19 Node st,ed; 20 21 void bfs(){ 22 memset(mark,false,sizeof(mark)); 23 queue<Node>Q; 24 Node p,q; 25 mark[st.x][st.y]=true; 26 Q.push(st); 27 while(!Q.empty()){ 28 p=Q.front(); 29 Q.pop(); 30 if(p.x==ed.x&&p.y==ed.y){ 31 cout<<p.path<<endl; 32 } 33 if(!map[p.x][p.y].E){ 34 q=p;q.x+=1; 35 if(q.x>=1&&q.x<=6&&q.y>=1&&q.y<=6&&!mark[q.x][q.y]){ 36 mark[q.x][q.y]=true; 37 q.path+='E'; 38 Q.push(q); 39 } 40 } 41 if(!map[p.x][p.y].W){ 42 q=p;q.x-=1; 43 if(q.x>=1&&q.x<=6&&q.y>=1&&q.y<=6&&!mark[q.x][q.y]){ 44 mark[q.x][q.y]=true; 45 q.path+='W'; 46 Q.push(q); 47 } 48 } 49 if(!map[p.x][p.y].N){ 50 q=p;q.y-=1; 51 if(q.x>=1&&q.x<=6&&q.y>=1&&q.y<=6&&!mark[q.x][q.y]){ 52 mark[q.x][q.y]=true; 53 q.path+='N'; 54 Q.push(q); 55 } 56 } 57 if(!map[p.x][p.y].S){ 58 q=p;q.y+=1; 59 if(q.x>=1&&q.x<=6&&q.y>=1&&q.y<=6&&!mark[q.x][q.y]){ 60 mark[q.x][q.y]=true; 61 q.path+='S'; 62 Q.push(q); 63 } 64 } 65 } 66 } 67 68 69 70 int main(){ 71 int x1,y1,x2,y2; 72 while(scanf("%d%d",&x1,&y1),(x1+y1)){ 73 scanf("%d%d",&x2,&y2); 74 st.x=x1,st.y=y1; 75 ed.x=x2,ed.y=y2; 76 memset(map,false,sizeof(map)); 77 for(int i=1;i<=3;i++){ 78 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 79 if(x1==x2){ 80 if(y1>y2)swap(y1,y2); 81 for(int j=y1+1;j<=y2;j++){ 82 map[x1][j].E=map[x1+1][j].W=true; 83 } 84 }else { 85 if(x1>x2)swap(x1,x2); 86 for(int j=x1+1;j<=x2;j++){ 87 map[j][y1].S=map[j][y1+1].N=true; 88 } 89 } 90 } 91 bfs(); 92 } 93 return 0; 94 }