1. 程式人生 > 其它 >poj 3414(bfs,將每個狀態+之前的操作作為一個Node,做bfs)

poj 3414(bfs,將每個狀態+之前的操作作為一個Node,做bfs)

#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; }