贴几道bfs题。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2216
思路:用一个四维的数组来保存状态,然后就是一般的bfs了,不过要注意的S,Z的初始位置要置为'.'(这个地方debug了好久,orz...).
View Code
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<queue> 6 using namespace std; 7 #define MAXN 33 8 int n,m; 9 char map[MAXN][MAXN]; 10 bool mark[MAXN][MAXN][MAXN][MAXN]; 11 int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; 12 struct Node{ 13 int sx,sy,ex,ey; 14 int step; 15 }; 16 Node st; 17 18 bool bfs(){ 19 memset(mark,false,sizeof(mark)); 20 queue<Node>Q; 21 Node p,q; 22 Q.push(st); 23 mark[st.sx][st.sy][st.ex][st.ey]=true; 24 while(!Q.empty()){ 25 p=Q.front(); 26 // printf("%d %d %d %d %d\n",p.sx,p.sy,p.ex,p.ey,p.step); 27 Q.pop(); 28 if((abs(p.sx-p.ex)+abs(p.sy-p.ey)<=1)){ 29 printf("%d\n",p.step); 30 return true; 31 } 32 for(int i=0;i<4;i++){ 33 q.sx=p.sx+dir[i][0]; 34 q.sy=p.sy+dir[i][1]; 35 if(q.sx>=1&&q.sx<=n&&q.sy>=1&&q.sy<=m&&map[q.sx][q.sy]!='X'){ 36 if(i==1){ 37 q.ex=p.ex+dir[0][0]; 38 q.ey=p.ey+dir[0][1]; 39 if(q.ex>=1&&q.ex<=n&&q.ey>=1&&q.ey<=m&&map[q.ex][q.ey]!='X'){ 40 if(!mark[q.sx][q.sy][q.ex][q.ey]){ 41 mark[q.sx][q.sy][q.ex][q.ey]=true; 42 q.step=p.step+1; 43 Q.push(q); 44 } 45 }else { 46 q.ex=p.ex,q.ey=p.ey; 47 if(!mark[q.sx][q.sy][q.ex][q.ey]){ 48 mark[q.sx][q.sy][q.ex][q.ey]=true; 49 q.step=p.step+1; 50 Q.push(q); 51 } 52 } 53 }else if(i==3){ 54 q.ex=p.ex+dir[2][0]; 55 q.ey=p.ey+dir[2][1]; 56 if(q.ex>=1&&q.ex<=n&&q.ey>=1&&q.ey<=m&&map[q.ex][q.ey]!='X'){ 57 if(!mark[q.sx][q.sy][q.ex][q.ey]){ 58 mark[q.sx][q.sy][q.ex][q.ey]=true; 59 q.step=p.step+1; 60 Q.push(q); 61 } 62 }else { 63 q.ex=p.ex,q.ey=p.ey; 64 if(!mark[q.sx][q.sy][q.ex][q.ey]){ 65 mark[q.sx][q.sy][q.ex][q.ey]=true; 66 q.step=p.step+1; 67 Q.push(q); 68 } 69 } 70 }else { 71 q.ex=p.ex+dir[i+1][0]; 72 q.ey=p.ey+dir[i+1][1]; 73 if(q.ex>=1&&q.ex<=n&&q.ey>=1&&q.ey<=m&&map[q.ex][q.ey]!='X'){ 74 if(!mark[q.sx][q.sy][q.ex][q.ey]){ 75 mark[q.sx][q.sy][q.ex][q.ey]=true; 76 q.step=p.step+1; 77 Q.push(q); 78 } 79 }else { 80 q.ex=p.ex,q.ey=p.ey; 81 if(!mark[q.sx][q.sy][q.ex][q.ey]){ 82 mark[q.sx][q.sy][q.ex][q.ey]=true; 83 q.step=p.step+1; 84 Q.push(q); 85 } 86 } 87 } 88 } 89 } 90 } 91 return false; 92 } 93 94 95 96 int main(){ 97 while(~scanf("%d%d",&n,&m)){ 98 memset(map,0,sizeof(map)); 99 for(int i=1;i<=n;i++) 100 scanf("%s",map[i]+1); 101 for(int i=1;i<=n;i++){ 102 for(int j=1;j<=m;j++){ 103 if(map[i][j]=='Z'){ 104 st.sx=i,st.sy=j,st.step=0; 105 }else if(map[i][j]=='S'){ 106 st.ex=i,st.ey=j; 107 } 108 } 109 } 110 if(!bfs()) 111 puts("Bad Luck!"); 112 } 113 return 0; 114 }
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1104
思路:注意要对(k*m)取模,然后就是用string来保存路径了。
View Code
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<queue> 6 using namespace std; 7 #define MAXN 4444 8 struct Node{ 9 int x,step; 10 string path; 11 }; 12 int n,m,k; 13 bool mark[MAXN]; 14 15 bool bfs(){ 16 memset(mark,false,sizeof(mark)); 17 queue<Node>Q; 18 Node p,q; 19 p.x=n,p.step=0,p.path=""; 20 mark[(p.x%k+k)%k]=true; 21 Q.push(p); 22 while(!Q.empty()){ 23 p=Q.front(); 24 Q.pop(); 25 if((p.x%k+k)%k==((n+1)%k+k)%k){ 26 cout<<p.step<<endl; 27 cout<<p.path<<endl; 28 return true; 29 } 30 q.step=p.step+1; 31 for(int i=0;i<4;i++){ 32 if(i==0){ 33 q.x=((p.x+m)%(k*m)+(k*m))%(k*m); 34 q.path=p.path+'+'; 35 }else if(i==1){ 36 q.x=((p.x-m)%(k*m)+(k*m))%(k*m); 37 q.path=p.path+'-'; 38 }else if(i==2){ 39 q.x=((p.x*m)%(k*m)+(k*m))%(k*m); 40 q.path=p.path+'*'; 41 }else { 42 q.x=(p.x%m+m)%m; 43 q.path=p.path+'%'; 44 } 45 if(!mark[(q.x%k+k)%k]){ 46 mark[(q.x%k+k)%k]=true; 47 Q.push(q); 48 } 49 } 50 } 51 return false; 52 } 53 54 55 int main(){ 56 while(scanf("%d%d%d",&n,&k,&m),n||k||m){ 57 if(!bfs()) 58 puts("0"); 59 } 60 return 0; 61 }
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1676
思路:Cost[i][j]二维数组不断更新到达城市i还剩燃料j时的最小花费,用spfa实现;
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 #include<vector> 6 using namespace std; 7 #define MAXN 1000+10 8 #define MAXC 100+10 9 #define inf 1<<30 10 struct Node{ 11 int v,d; 12 }; 13 vector<Node>Map[MAXN]; 14 15 struct Point{ 16 int city,cost,fuel; 17 bool operator < (const Point &p) const { 18 return p.cost<cost; 19 } 20 }; 21 22 int Cost[MAXN][MAXC];//记录到城市i有燃料j的最小花费 23 int mark[MAXN][MAXC];//标记 24 int value[MAXN]; 25 int n,m,c,st,ed; 26 27 void bfs(){ 28 priority_queue<Point>Q; 29 Point p,q; 30 p.city=st,p.cost=p.fuel=0; 31 Cost[st][0]=0; 32 Q.push(p); 33 while(!Q.empty()){ 34 p=Q.top(); 35 Q.pop(); 36 int city=p.city,cost=p.cost,fuel=p.fuel; 37 if(mark[city][fuel])continue; 38 if(city==ed){ 39 return ; 40 } 41 if(fuel<c){ 42 if(cost+value[city]<Cost[city][fuel+1]){ 43 Cost[city][fuel+1]=cost+value[city]; 44 q.city=city,q.cost=cost+value[city],q.fuel=fuel+1; 45 Q.push(q); 46 } 47 } 48 for(int i=0;i<Map[city].size();i++){ 49 int v=Map[city][i].v; 50 int d=Map[city][i].d; 51 if(fuel-d>=0&&Cost[city][fuel]<Cost[v][fuel-d]){ 52 Cost[v][fuel-d]=Cost[city][fuel]; 53 q.city=v,q.cost=Cost[v][fuel-d],q.fuel=fuel-d; 54 Q.push(q); 55 } 56 } 57 mark[city][fuel]=true; 58 } 59 } 60 61 62 int main(){ 63 int _case,u,v,dist; 64 scanf("%d%d",&n,&m); 65 for(int i=0;i<n;i++)scanf("%d",&value[i]); 66 for(int i=1;i<=m;i++){ 67 scanf("%d%d%d",&u,&v,&dist); 68 Node p1,p2; 69 p1.v=v,p2.v=u; 70 p1.d=p2.d=dist; 71 Map[u].push_back(p1); 72 Map[v].push_back(p2); 73 } 74 scanf("%d",&_case); 75 while(_case--){ 76 scanf("%d%d%d",&c,&st,&ed); 77 for(int i=0;i<n;i++){ 78 for(int j=0;j<=c;j++){ 79 Cost[i][j]=inf; 80 mark[i][j]=false; 81 } 82 } 83 bfs(); 84 //由于要花费最小,到达最后一个城市必然燃料用尽 85 Cost[ed][0]<inf?printf("%d\n",Cost[ed][0]):puts("impossible"); 86 } 87 return 0; 88 }