poj 3414 BFS
开始我自己写的。思路对的,但是用的变量太多啦!!学习人家的方法。好好学!过后要认真思考
#include <iostream>
#include <fstream>
#include <queue>
#include <memory.h>
#include <string>
using namespace std;
int a,b,c;
struct node
{
int a1,b1;
string str;
node(int a2,int b2,string str1)
{
a1=a2; b1=b2; str=str1;
}
node(){}
};
queue<node> q;
bool flag[101][101]; //判断这个状态是否出现过。相当于减枝吧?是不是?我也不知道。没看剪枝部分
bool jude=false; //用于判断是否可以成功
node start(0,0,"");
node final;
void printpath(node n)
{
int i,j;
i=n.str.size();
printf("%d\n",i);
for(j=0; j<i ;j++)
{
switch(n.str[j])
{
case '0':printf("FILL(1)\n");break;
case '1':printf("FILL(2)\n");break;
case '2':printf("DROP(1)\n");break;
case '3':printf("DROP(2)\n");break;
case '4':printf("POUR(2,1)\n");break;
case '5':printf("POUR(1,2)\n");break;
}
}
}
void bfs()
{
int i;
q.push(start);
while(!q.empty())
{
node next=q.front();
q.pop();
if(next.a1==c || next.b1==c)
{
jude=true;
final=next;
return;
}
for(i=0; i<6; i++)
{
if(i==0 && next.a1!=a)
{
node temp(a,next.b1,next.str+'0');
if(flag[temp.a1][temp.b1]==true)
{
flag[temp.a1][temp.b1]=false;
q.push(temp);
}
}
else if(i==1 && next.b1!=b)
{
node temp(next.a1,b,next.str+'1');
if(flag[temp.a1][temp.b1]==true)
{
flag[temp.a1][temp.b1]=false;
q.push(temp);
}
}
else if(i==2 && next.a1!=0)
{ //drop(1)
node temp(0,next.b1,next.str+'2');
if(flag[temp.a1][temp.b1]==true)
{
flag[temp.a1][temp.b1]=false;
q.push(temp);
}
}
else if(i==3 && next.b1!=0)
{
node temp(next.a1,0,next.str+'3');
if(flag[temp.a1][temp.b1]==true)
{
flag[temp.a1][temp.b1]=false;
q.push(temp);
}
}
else if(i==4 && next.a1!=a && next.b1!=0)
{ //pour(2,1);
if(a-next.a1<=next.b1)
{
node temp(a,next.b1-a+next.a1,next.str+'4');
if(flag[temp.a1][temp.b1]==true)
{
flag[temp.a1][temp.b1]=false;
q.push(temp);
}
}
else
{
node temp(next.a1+next.b1,0,next.str+'4');
if(flag[temp.a1][temp.b1]==true)
{
flag[temp.a1][temp.b1]=false;
q.push(temp);
}
}
}
else if(i==5 && next.a1!=0 && next.b1!=b)
{ //pour(1,2)
if(b-next.b1<=next.a1)
{
node temp(next.a1-b+next.b1,b,next.str+'5');
if(flag[temp.a1][temp.b1]==true)
{
flag[temp.a1][temp.b1]=false;
q.push(temp);
}
}
else
{
node temp(0,next.a1+next.b1,next.str+'5');
if(flag[temp.a1][temp.b1]==true)
{
flag[temp.a1][temp.b1]=false;
q.push(temp);
}
}
}
}//for
}//while
}
int main()
{
memset(flag,true,sizeof(flag));
freopen("acm.txt","r",stdin);
scanf("%d%d%d",&a,&b,&c);
bfs();
if(jude==false)
{
printf("impossible\n");
}
else
{
printpath(final);
}
return 0;
}
我是一名在校大学生,热爱编程,虽然起步晚了些,但我会努力的。呵呵!
数据结构 算法