POUR(2,1)
//刘汝佳的小白书里,只是提到过一个概念,叫做隐式图搜索,个人觉得,就是搜索的,不是常见的矩阵或者邻接表存储的图,而是比较抽象的图,以本题为例,状态可以理解为图的节点,由这个状态能到另一个状态就是表明这两个状态之间是有边的 ,那么就可以以图的搜索思路来写了,本题的状态是两个杯子的水量,比如初始没有水,那就是(0,0),但是有三种操作,所以由(0,0)可以到(A,0),(0,B)...等
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<vector> #include<map> #include<stack> using namespace std; const int maxn=50005; const int inf=200000; #define lson rt<<1,l,m #define rson rt<<1|1,m+1,r template<class T>inline T read(T&x) { char c; while((c=getchar())<=32); bool ok=false; if(c=='-')ok=true,c=getchar(); for(x=0; c>32; c=getchar()) x=x*10+c-'0'; if(ok)x=-x; return x; } template<class T> inline void read_(T&x,T&y) { read(x); read(y); } template<class T> inline void write(T x) { if(x<0)putchar('-'),x=-x; if(x<10)putchar(x+'0'); else write(x/10),putchar(x%10+'0'); } template<class T>inline void writeln(T x) { write(x); putchar('\n'); } // -------IO template------ int A,B,C; struct node { int a,b; int id; node(int x,int y,int d){id=d;a=x;b=y;} }; bool vis[105][105]; int num=0; int d[maxn]; int p[maxn]; bool ok; map<int,string> mp; map<int,string>::iterator it; void bfs(node s) { queue<node> q; q.push(s); memset(vis,false,sizeof(vis)); memset(p,-1,sizeof(p)); mp.clear(); d[0]=0; p[0]=-1; vis[s.a][s.b]=true; num=1; while(!q.empty()) { node s=q.front();q.pop(); if(s.a==C||s.b==C) { printf("%d\n",d[s.id]); it=mp.begin(); stack<string> ss; for(int i=s.id;i!=-1;i=p[i]) { // printf("(%d)\n",i); it=mp.begin(); while(it->first!=i&&it!=mp.end()) { it++; } ss.push(it->second); } ss.pop(); while(!ss.empty()) { printf("%s\n",ss.top().c_str()); ss.pop(); } ok=1; return; } //bfs按层次搜索能到达的六条边 if(s.a<A&&!vis[A][s.b]) { vis[A][s.b]=true; q.push(node(A,s.b,num)); d[num]=d[s.id]+1; mp[num]="FILL(1)"; p[num++]=s.id; } if(s.b<B&&!vis[s.a][B]) { vis[s.a][B]=true; q.push(node(s.a,B,num)); d[num]=d[s.id]+1; mp[num]="FILL(2)"; p[num++]=s.id; } if(s.a>0&&!vis[0][s.b]) { vis[0][s.b]=true; q.push(node(0,s.b,num)); d[num]=d[s.id]+1; mp[num]="DROP(1)"; p[num++]=s.id; } if(s.b>0&&!vis[s.a][0]) { vis[s.a][0]=true; q.push(node(s.a,0,num)); d[num]=d[s.id]+1; mp[num]="DROP(2)"; p[num++]=s.id; } if(s.a>0&&s.b<B) { int t=min(s.a,B-s.b); if(!vis[s.a-t][s.b+t]) { vis[s.a-t][s.b+t]=true; q.push(node(s.a-t,s.b+t,num)); d[num]=d[s.id]+1; mp[num]="POUR(1,2)"; p[num++]=s.id; } } if(s.a<A&&s.b>0) { int t=min(s.b,A-s.a); if(!vis[s.a+t][s.b-t]) { vis[s.a+t][s.b-t]=true; q.push(node(s.a+t,s.b-t,num)); d[num]=d[s.id]+1; mp[num]="POUR(2,1)"; p[num++]=s.id; } } } } int main() { int n,m,i,j,k,t; // freopen("in.txt","r",stdin); read(A); read(B); read(C); ok=0; bfs(node(0,0,0)); if(!ok)printf("impossible\n"); return 0; }
H - Pots POJ 3414 算是小白书所讲的一般隐式图搜索, BFS
原文:http://blog.csdn.net/u013167299/article/details/44543107