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