POJ3414广搜&回溯

//bfs+回溯 #include #include #include #include using namespace std; int a,b,c; int res; bool visited[110][110]; struct node { int a,b;//1,2中的水 int steps; int flag;//标记经过的操作 node *pre;//上步状态 }; stack sta; int min(int a,int b) { if(ab) return a; return b; } void bfs() { queue que; node cur,map[1000]; cur.a=0; cur.b=0; cur.steps=0; cur.flag=0; visited[0][0]=1; cur.pre=NULL; que.push(cur); int count=-1; while(!que.empty()) { cur=que.front(); que.pop(); map[++count]=cur; if(cur.a==c||cur.b==c) { res=cur.steps; while(cur.pre!=NULL) { sta.push(cur.flag); cur=*cur.pre; } return ; } node next; for(int i=1;i<=6;i++) { if(i==1)//将1倒满 { if(cur.a==a) continue; next.a=a; next.b=cur.b; } else if(i==2)//将2倒满 { if(cur.b==b) continue; next.a=cur.a; next.b=b; } else if(i==3)//将1倒空 { if(cur.a==0) continue; next.a=0; next.b=cur.b; } else if(i==4)//将2倒空 { if(cur.b==0) continue; next.a=cur.a; next.b=0; } else if(i==5)//将2倒入1中 { if(cur.b==0||cur.a==a) continue; next.a=min(a,cur.a+cur.b); next.b=max(0,cur.a+cur.b-a); } else if(i==6)//将1倒入2中 { if(cur.a==0||cur.b==b) continue; next.b=min(b,cur.a+cur.b); next.a=max(0,cur.a+cur.b-b); } next.flag=i; if(visited[next.a][next.b]==0) { visited[next.a][next.b]=1; next.steps=cur.steps+1; next.pre=&map[count]; //起初我没有用map[count],而是让next.pre=&cur,结果在回溯是造成 //死循环,经过多次检查后才发现cur不行,必须用数组存起来…^&^!! que.push(next); } } } } int main() { while(scanf("%d%d%d",&a,&b,&c)==3) { bfs(); if(res==0) { puts("impossible");continue; } printf("%d/n",res); while(!sta.empty()) { int i=sta.top(); sta.pop(); if(i==1) puts("FILL(1)"); else if(i==2) puts("FILL(2)"); else if(i==3) puts("DROP(1)"); else if(i==4) puts("DROP(2)"); else if(i==5) puts("POUR(2,1)"); else puts("POUR(1,2)"); } memset(visited,0,sizeof(visited)); } return 0; }

你可能感兴趣的:(搜索)