poj3414
靠的,写了一上午,终于AC了,靠的............poj的题确实要麻烦一些.
代码有点长,但思路一点也不麻烦。
1,找最短路时,用bfs。这个很简单。 2,关键,不太熟悉记录路径。最后借鉴了一下别人的算法,用一个结构体数组存储路径,再用dfs 的思想找到起点。
顺势输出, KO! 写完之后,回顾一下,就是考察你会不会回溯。要深刻理解回溯啊!太有用了
#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;
int a,b,c;
int result;
struct node
{
int x;
int y;
int step;
};
struct point
{
int px;
int py;
int chao; //存储从 [px,py] 到 [x,y]的操作
}pre[110][110]; //用来存储父节点,例如 p[x][y]的父节点是 p[x][y].px, p[x][y].py;
int visit[110][110];
void dfs(int x,int y)
{
if(x+y!=0)
{
//printf("%d %d\n",x,y);
dfs(pre[x][y].px,pre[x][y].py);
}
if(pre[x][y].chao==1)
{
printf("FILL(1)\n");
return ;
}
if(pre[x][y].chao==2)
{
printf("FILL(2)\n");
return ;
}
if(pre[x][y].chao==3)
{
printf("DROP(1)\n");
return ;
}
if(pre[x][y].chao==4)
{
printf("DROP(2)\n");
return ;
}
if(pre[x][y].chao==5)
{
printf("POUR(2,1)\n");
return ;
}
if(pre[x][y].chao==6)
{
printf("POUR(1,2)\n");
return ;
}
}
void bfs()
{
memset(visit,0,sizeof(visit));
memset(pre,0,sizeof(pre));
queue<node> qu;
node p,temp;
p.x=0;
p.y=0;
p.step=0;
visit[p.x][p.y]=1; //这个点已经访问过
qu.push(p);
while(!qu.empty())
{
p=qu.front();
qu.pop();
if(p.x==c||p.y==c)
{
printf("%d\n",p.step);
dfs(p.x,p.y);
result=1;
}
//temp.step=p.step+1;
// fill 1
temp.x=a;
temp.y=p.y;
if(!visit[temp.x][temp.y])
{
pre[temp.x][temp.y].px=p.x; //存储路径
pre[temp.x][temp.y].py=p.y;
pre[temp.x][temp.y].chao=1;
visit[temp.x][temp.y]=1;
temp.step=p.step+1;
qu.push(temp);
}
//fill 2
temp.x=p.x;
temp.y=b;
if(!visit[temp.x][temp.y])
{
pre[temp.x][temp.y].px=p.x; //存储路径
pre[temp.x][temp.y].py=p.y;
pre[temp.x][temp.y].chao=2;
visit[temp.x][temp.y]=1;
temp.step=p.step+1;
qu.push(temp);
}
//drop 1
temp.x=0;
temp.y=p.y;
if(!visit[temp.x][temp.y])
{
pre[temp.x][temp.y].px=p.x; //存储路径
pre[temp.x][temp.y].py=p.y;
pre[temp.x][temp.y].chao=3;
visit[temp.x][temp.y]=1;
temp.step=p.step+1;
qu.push(temp);
}
//drop 2
temp.x=p.x;
temp.y=0;
if(!visit[temp.x][temp.y])
{
pre[temp.x][temp.y].px=p.x; //存储路径
pre[temp.x][temp.y].py=p.y;
pre[temp.x][temp.y].chao=4;
visit[temp.x][temp.y]=1;
temp.step=p.step+1;
qu.push(temp);
}
//pour(2,1)
if(p.x+p.y<=a)
{
temp.x=p.x+p.y;
temp.y=0;
if(!visit[temp.x][temp.y])
{
pre[temp.x][temp.y].px=p.x; //存储路径
pre[temp.x][temp.y].py=p.y;
pre[temp.x][temp.y].chao=5;
visit[temp.x][temp.y]=1;
temp.step=p.step+1;
qu.push(temp);
}
}
else
{
temp.x=a;
temp.y=p.x+p.y-a;
if(!visit[temp.x][temp.y])
{
pre[temp.x][temp.y].px=p.x; //存储路径
pre[temp.x][temp.y].py=p.y;
pre[temp.x][temp.y].chao=5;
visit[temp.x][temp.y]=1;
temp.step=p.step+1;
qu.push(temp);
}
}
// drop(1,2)
if(p.x+p.y<=b)
{
temp.x=0;
temp.y=p.x+p.y;
if(!visit[temp.x][temp.y])
{
pre[temp.x][temp.y].px=p.x; //存储路径
pre[temp.x][temp.y].py=p.y;
pre[temp.x][temp.y].chao=6;
visit[temp.x][temp.y]=1;
temp.step=p.step+1;
qu.push(temp);
}
}
else
{
temp.x=p.x+p.y-b;
temp.y=b;
if(!visit[temp.x][temp.y])
{
pre[temp.x][temp.y].px=p.x; //存储路径
pre[temp.x][temp.y].py=p.y;
pre[temp.x][temp.y].chao=6;
visit[temp.x][temp.y]=1;
temp.step=p.step+1;
qu.push(temp);
}
}
}
}
int main()
{
int i,j,k;
while(cin>>a>>b>>c)
{
result=0;
bfs();
if(result==0)
printf("impossible\n");
}
return 0;
}