Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

幼稚代码献上(BFS)

Posted by kaitian5201314 at 2010-08-21 21:17:04 on Problem 3414
//一不小心AC了...这道题目挺好玩的哈  BFS
//2个瓶子倒水,一共有6种倒法,枚举即可,但相同出现的状态不要重复出现
//并且还要记住上一次的操作。。。
//因为是special judge,所以我觉得DFS也可以吧?

#include<iostream>
using namespace std;

bool visit[110][110];//标记某种状态是否已经出现过

struct node
{
	int x;//A瓶的剩余量
	int y;//B瓶的剩余量
	int pre;//上一次操作的ID值
	int step;//走到这一步时候的步骤数目
	int op;//操作的类型:从1到6

};

node q[100000],temp,tt;//队列



int rear,front,x,y,step,ID,xx,yy;
int m,n,rest;

void show(int pre)//递归输出结果
{
	if(pre==-1)//直接返回,不必输出
		return ;
	show(q[pre].pre);

	if(q[pre].op==1)
	{
		printf("FILL(1)\n");
		return ;
	}

	if(q[pre].op==2)
	{
		printf("FILL(2)\n");
		return ;
	}

	if(q[pre].op==3)
	{
		printf("DROP(1)\n");
		return ;
	}

	if(q[pre].op==4)
	{
		printf("DROP(2)\n");
		return ;
	}

	if(q[pre].op==5)
	{
		printf("POUR(1,2)\n");
		return ;
	}

	if(q[pre].op==6)
	{
		printf("POUR(2,1)\n");
		return ;
	}
}

void process()//BFS函数
{
	int i;
	visit[0][0]=1;

	temp.pre=-1;
	temp.step=0;
	temp.x=0;
	temp.y=0;

	q[rear++]=temp;//初始化

	while(front!=rear)//队列为空,退出
	{
		tt=q[front++];

		x=tt.x;
		step=tt.step;
		y=tt.y;

		if(x==rest||y==rest)//找到一个最快的结果
		{
			printf("%d\n",step);
			show(front-1);
			return ;
		}

		for(i=1;i<=6;i++)
		{
			if(i==1)
			{
				xx=m;
				yy=y;
				
				if(!visit[xx][yy])
				{
					q[rear].x=xx;
					q[rear].y=yy;
					q[rear].op=i;
					q[rear].step=step+1;
					q[rear++].pre=front-1;
					visit[xx][yy]=1;

				}
				
				continue;
			}

			if(i==2)
			{
				xx=x;
				yy=n;
				
				if(!visit[xx][yy])
				{
					q[rear].x=xx;
					q[rear].y=yy;
					q[rear].op=i;
					q[rear].step=step+1;
					q[rear++].pre=front-1;
					visit[xx][yy]=1;

				}
				
				continue;
			}

			if(i==3)
			{
				xx=0;
				yy=y;
				
				if(!visit[xx][yy])
				{
					q[rear].x=xx;
					q[rear].y=yy;
					q[rear].op=i;
					q[rear].step=step+1;
					q[rear++].pre=front-1;
					visit[xx][yy]=1;

				}
				
				continue;
			}

			if(i==4)
			{
				xx=x;
				yy=0;
				
				if(!visit[xx][yy])
				{
					q[rear].x=xx;
					q[rear].y=yy;
					q[rear].op=i;
					q[rear].step=step+1;
					q[rear++].pre=front-1;
					visit[xx][yy]=1;

				}
				
				continue;
			}

			if(i==5)
			{
				if(x>n-y)
				{
					xx=x-n+y;
					yy=n;
				}
				else
				{
					xx=0;
					yy=y+x;
				}
				
				if(!visit[xx][yy])
				{
					q[rear].x=xx;
					q[rear].y=yy;
					q[rear].op=i;
					q[rear].step=step+1;
					q[rear++].pre=front-1;
					visit[xx][yy]=1;

				}
				
				continue;
			}

			if(i==6)
			{
				if(y>m-x)
				{
					xx=m;
					yy=y-m+x;
				}
				else
				{
					xx=x+y;
					yy=0;
				}
				
				if(!visit[xx][yy])
				{
					q[rear].x=xx;
					q[rear].y=yy;
					q[rear].op=i;
					q[rear].step=step+1;
					q[rear++].pre=front-1;
					visit[xx][yy]=1;

				}
				
				continue;
			}


		}

	}
	printf("impossible\n");
	

}
int main()
{
	scanf("%d%d%d",&m,&n,&rest);
	process();
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator