您的位置:首页 > 其它

UVA 571 Jugs

2013-01-15 18:07 316 查看
大意不再赘述。

思路:这道题写了好久额。

说是说数学题,但我用隐式图的遍历过了。开两个数组,fa记录前驱,f记录当前操作,然后模拟即可。

还有一个BUG,操作的时候,最好把cur.v[0],cur.v[1]分别赋给两个变量ca,cb,要不然会导致结果出错而且不容易查错。

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cstring>
#include <string>
#include <queue>
using namespace std;

const int MAXN = 1010;
const int INF = 0x3f3f3f3f;

struct node
{
	int v[2];
}q[1005*10050];

int fa[1005*10050];
int f[1005*10050];
bool vis[1010][1010];
int jugs[2], goal;

char answer[10][100] = {"fill A", "fill B", "empty A", "empty B", "pour A B", "pour B A"};

void init()
{
	memset(vis, 0, sizeof(vis));
}

void print_ans(int i)
{
	if(!i) return ;
	else
	{
		print_ans(fa[i]);
		printf("%s\n", answer[f[i]]);
	}
}

void bfs()
{
	node cur;
	int front = 0, rear = 1;
	q[0].v[0] = 0, q[0].v[1] = 0, fa[1] = 0;
	vis[0][0] = 1;
	while(front < rear)
	{
		cur = q[front];
		int ca = cur.v[0], cb = cur.v[1];
		if(ca != jugs[0] && !vis[jugs[0]][cb]) // fill A
		{
			cur.v[0] = jugs[0];
			cur.v[1] = cb;
			f[rear] = 0;
			fa[rear] = front;
			vis[jugs[0]][cb] = 1;
			if(cur.v[1] == goal) break;
			q[rear++] = cur;
		}
		if(cb != jugs[1] && !vis[ca][jugs[1]]) // fill B
		{
			cur.v[0] = ca;
			cur.v[1] = jugs[1];
			f[rear] = 1;
			fa[rear] = front;
			vis[ca][jugs[1]] = 1;
			if(cur.v[1] == goal) break;
			q[rear++] = cur;
		}
		if(ca && !vis[0][cb]) // empty A
		{
			cur.v[0] = 0;
			cur.v[1] = cb;
			f[rear] = 2;
			fa[rear] = front;
			vis[0][cb] = 1;
			if(cur.v[1] == goal) break;
			q[rear++] = cur;
		}
		if(cb && !vis[ca][0]) // empty B
		{
			cur.v[0] = ca;
			cur.v[1] = 0;
			f[rear] = 3;
			fa[rear] = front;
			vis[ca][0] = 1;
			if(cur.v[1] == goal) break;
			q[rear++] = cur;
		}
		if(ca && cb != jugs[1]) // pour A B
		{
			if(jugs[1] >= ca+cb && !vis[0][ca+cb])
			{
				cur.v[1] = ca+cb;
				cur.v[0] = 0;
				f[rear] = 4;
				fa[rear] = front;
				vis[0][ca+cb] = 1; 
				if(cur.v[1] == goal) break;
				q[rear++] = cur;
			}
			else if(!vis[ca+cb-jugs[1]][jugs[1]])
			{
				cur.v[0] = ca+cb-jugs[1];
				cur.v[1] = jugs[1];
				f[rear] = 4;
				fa[rear] = front;
				vis[ca+cb-jugs[1]][jugs[1]] = 1;
				if(cur.v[1] == goal) break;
				q[rear++] = cur;
			}
		}
		if(cb && ca != jugs[0]) //pour B A
		{
			if(jugs[0] >= ca+cb && !vis[ca+cb][0])
			{
				cur.v[0] = ca+cb;
				cur.v[1] = 0;
				f[rear] = 5;
				fa[rear] = front;
				vis[ca+cb][0] = 1;
				if(cur.v[1] == goal) break;
				q[rear++] = cur;
			}
			else if(!vis[jugs[0]][ca+cb-jugs[0]])
			{
				cur.v[1] = ca+cb-jugs[0];
				cur.v[0] = jugs[0];
				f[rear] = 5;
				fa[rear] = front;
				vis[jugs[0]][ca+cb-jugs[0]] = 1;
				if(cur.v[1] == goal) break;
				q[rear++] = cur;
			}
		}
		front++;
	}
	print_ans(rear);
	printf("success\n");
}

void solve()
{
	init();
	bfs();
}

int main()
{
	while(~scanf("%d%d%d", &jugs[0], &jugs[1], &goal))
	{
		solve();
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: