首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

搜寻:zoj 1005 Jugs || poj 1606 (广搜做法)

2012-12-27 
搜索:zoj 1005 Jugs || poj 1606 (广搜做法)【转】http://blog.csdn.net/zxy_snow/article/details/5740824#

搜索:zoj 1005 Jugs || poj 1606 (广搜做法)

【转】http://blog.csdn.net/zxy_snow/article/details/5740824

#include <stdio.h>
#include <stdlib.h>
#define Afull 1
#define Bfull 2
#define Aempty 3
#define Bempty 4
#define AtoB 5
#define BtoA 6???????
//下面用着方便呀~
int head,tail;
char step[7][10] = {"0","fill A","fill B","empty A","empty B","pour A B","pour B A"};
struct pos???????? //算是链表吧
{
??? int mark;
??? int a;
??? int b;
??? struct pos *former;
};
typedef struct pos sta;
sta Q[100000];???????? //队列
void EnQ(sta x)??????? //入队
{
??? Q[head++] = x;
}
sta DeQ(void)?????????? //出队
{
??? return Q[tail++];
}
int check( sta x )?????? //判断是否A B 是否重复
{
??? int i;
??? for( i=0; i<head; i++)
??????? if( Q[i].a==x.a && Q[i].b==x.b)
??????????? return 1;
??? return 0;
}
int Qempty(void)??? //判断队列是否为空
{
??? if( head == tail )
??????? return 1;
??? return 0;
}
/**********************主函数**************************/
int main(void)
{
??? int A,B,N,i;
??? sta temp,*point,s,*search,*result[100000];
??? while ( scanf("%d%d%d",&A,&B,&N)!=EOF )
??? {
??????? head = 0;
??????? tail = 0;
??????? temp.a = 0;
??????? temp.b = 0;
??????? temp.mark = 0;
??????? temp.former = NULL;
??????? EnQ( temp );
??????? while( !Qempty() )
??????? {
??????????? temp = DeQ();
??????????? point = &Q[tail-1];
??????????? if( temp.a == N || temp.b == N )????
??????????????? break;
???????????????
??????????? s = temp;
??????????? s.a = A;
??????????? if( !check(s) && temp.a != A ) // Afull
??????????? {
??????????????? s.former = point;
??????????????? s.mark = Afull;
??????????????? EnQ(s);
??????????? }
???????????
??????????? s = temp;
??????????? s.b = B;
??????????? if( !check(s) && temp.b != B )? //Bfull
??????????? {
??????????????? s.former = point;
??????????????? s.mark = Bfull;
??????????????? EnQ(s);
??????????? }
???????????
??????????? s = temp;
??????????? s.a = 0;
??????????? if( !check(s) && temp.a )? //Aempty
??????????? {
??????????????? s.former = point;
??????????????? s.mark = Aempty;
??????????????? EnQ(s);
??????????? }
???????????
??????????? s = temp;
??????????? s.b = 0;
??????????? if( !check(s) && temp.b )? //Bempty
??????????? {
??????????????? s.former = point;
??????????????? s.mark = Bempty;
??????????????? EnQ(s);
??????????? }
???????????
??????????? s = temp;
??????????? if( s.a!=0 && s.b<B && s.a<= B- s.b ) // AtoB
??????????? {
??????????????? s.b += s.a;
??????????????? s.a = 0;
??????????????? if( !check(s) )
??????????????? {
??????????????????? s.former = point;
??????????????????? s.mark = AtoB;
??????????????????? EnQ(s);
??????????????? }
??????????? }
??????????? else
??????????? {
??????????????? if( s.a!=0 && s.b<B)
??????????????? {
??????????????????? s.a -= (B - s.b);
??????????????????? s.b = B;
??????????????????? if( !check(s) )
??????????????????? {
??????????????????????? s.former = point;
??????????????????????? s.mark = AtoB;
??????????????????????? EnQ(s);
??????????????????? }
??????????????? }
??????????? }
??????????? s = temp;
??????????? if( s.b!=0 && s.a<A && s.b<= A- s.a ) //BtoA
??????????? {
??????????????? s.a += s.b;
??????????????? s.b = 0;
??????????????? if( !check(s) )
??????????????? {
??????????????????? s.former = point;
??????????????????? s.mark = BtoA;
??????????????????? EnQ(s);
??????????????? }
??????????? }
??????????? else
??????????? {
??????????????? if( s.b!=0 && s.a<A)
??????????????? {
??????????????????? s.b -= (A - s.a);
??????????????????? s.a = A;
??????????????????? if( !check(s) )
??????????????????? {
??????????????????????? s.former = point;
??????????????????????? s.mark = BtoA;
??????????????????????? EnQ(s);
??????????????????? }
??????????????? }
??????????? }
??????? }
??????? search = point;
??????? for(i=0; search!=NULL;i++)?? //查找到第一个节点
??????? {
??????????? result[i] = search;
??????????? search = search->former;
??????? }
??????? for(i-=2; i>=0; i--)
??????????? puts( step[result[i]->mark] );
??????? printf("success/n");
??? }
system("pause");
return 0;
}

热点排行