1. 程式人生 > 其它 >bfs非常可樂

bfs非常可樂

題目:

https://vjudge.net/problem/HDU-1495

用v記錄出現過的狀態,bfs

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
int v[102][102][102];
int s,n,m;
struct node
{
    int ts,tn,tm,level;
};
int bfs()
{ memset(v,0,sizeof(v));
queue<node> que;
    
if(s%2==1) return -1; int aves=s/2; node w; w.ts=s; w.tn=0; w.tm=0; w.level=0; v[s][0][0]=1; que.push(w); while(!que.empty()) { node q=que.front(); que.pop(); int ts=q.ts,tn=q.tn,tm=q.tm; if(ts==aves&&tn==aves||ts==aves&&tm==aves||tn==aves&&tm==aves) {
return q.level; } node p; for(int i=0;i<6;i++) { ts=q.ts,tn=q.tn,tm=q.tm; //s->n if(i==0) { if(ts&&ts>=n-tn) { ts-=n-tn; tn=n; }
else { tn+=ts; ts=0; } if(!v[ts][tn][tm]) { v[ts][tn][tm]=1; p.ts=ts; p.tn=tn; p.tm=tm; p.level=q.level+1; que.push(p); } } //s->m if(i==1) { if(ts&&ts>=m-tm) { ts-=m-tm; tm=m; } else { tm+=ts; ts=0; } if(!v[ts][tn][tm]) { v[ts][tn][tm]=1; p.ts=ts; p.tn=tn; p.tm=tm; p.level=q.level+1; que.push(p); } } //n->s if(i==2) { if(tn&&tn>=s-ts) { tn-=s-ts; ts=s; } else { ts+=tn; tn=0; } if(!v[ts][tn][tm]) { v[ts][tn][tm]=1; p.ts=ts; p.tn=tn; p.tm=tm; p.level=q.level+1; que.push(p); } } //n->m if(i==3) { if(tn&&tn>=m-tm) { tn-=m-tm; tm=m; } else { tm+=tn; tn=0; } if(!v[ts][tn][tm]) { v[ts][tn][tm]=1; p.ts=ts; p.tn=tn; p.tm=tm; p.level=q.level+1; que.push(p); } } //m->s if(i==4) { if(tm&&tm>=s-ts) { tm-=s-ts; ts=s; } else { ts+=tm; tm=0; } if(!v[ts][tn][tm]) { v[ts][tn][tm]=1; p.ts=ts; p.tn=tn; p.tm=tm; p.level=q.level+1; que.push(p); } } //m->n if(i==5) { if(tm&&tm>=n-tn) { tm-=n-tn; tn=n; } else { tn+=tm; tm=0; } if(!v[ts][tn][tm]) { v[ts][tn][tm]=1; p.ts=ts; p.tn=tn; p.tm=tm; p.level=q.level+1; que.push(p); } } } } return -1; } int main() { while(1) { scanf("%d %d %d",&s,&n,&m); if(s==0&&n==0&&m==0) break; int ans=bfs(); if(ans==-1) printf("NO\n"); else printf("%d\n",ans); } }