poj 3414(bfs,將每個狀態+之前的操作作為一個Node,做bfs)
阿新 • • 發佈:2021-11-30
#include<iostream> #include<queue> #include<cstring> using namespace std; #define maxn 105 int a,b,c; bool visit[maxn][maxn]; struct node{ int a,b,cnt,path[maxn*maxn]; node(int ai,int bi,int cnti){ a = ai; b = bi; cnt = cnti; } }; const char msg[][15] = { "FILL(1)", "FILL(2)", "DROP(1)", "DROP(2)", "POUR(1,2)", "POUR(2,1)" }; typedef node Node; void bfs(){ memset(visit,false,sizeof visit); queue<Node>q; Node f(0,0,0); visit[0][0] = true; q.push(f); while(!q.empty()){ f = q.front();q.pop();if(f.a==c||f.b==c){ cout<<f.cnt<<endl; for(int i=1;i<=f.cnt;i++){ cout<<msg[f.path[i]]<<endl; } return; } Node v = f; v.cnt++; if(a-f.a>0){ v.a = a; v.b= f.b; if(!visit[v.a][v.b]){ visit[v.a][v.b] = true; v.path[v.cnt]=0; q.push(v); } } if(b-f.b>0){ v.a = f.a; v.b = b; if(!visit[v.a][v.b]){ visit[v.a][v.b] = true; v.path[v.cnt] = 1; q.push(v); } } if(f.a){ v.a = 0; v.b = f.b; if(!visit[v.a][v.b]){ visit[v.a][v.b] = true; v.path[v.cnt] = 2; q.push(v); } } if(f.b){ v.a = f.a; v.b = 0; if(!visit[v.a][v.b]){ visit[v.a][v.b] = true; v.path[v.cnt] = 3; q.push(v); } } if(f.a>0&&f.b+f.a<=b){ v.a = 0; v.b = f.b+f.a; if(!visit[v.a][v.b]){ visit[v.a][v.b] = true; v.path[v.cnt] = 4; q.push(v); } } if(f.a>0&&f.b+f.a>b){ v.a = f.a-(b-f.b); v.b = b; if(!visit[v.a][v.b]){ visit[v.a][v.b] = true; v.path[v.cnt] = 4; q.push(v); } } if(f.b>0&&f.a+f.b<=a){ v.a = f.a+f.b; v.b = 0; if(!visit[v.a][v.b]){ visit[v.a][v.b] = true; v.path[v.cnt] = 5; q.push(v); } } if(f.b>0&&f.a+f.b>a){ v.a = a; v.b = f.b-(a-f.a); if(!visit[v.a][v.b]){ visit[v.a][v.b] = true; v.path[v.cnt] = 5; q.push(v); } } } printf("impossible\n"); } int main(){ scanf("%d%d%d",&a,&b,&c); bfs(); return 0; }