POJ3414 Pots 倒水问题(BFS)

求最少步骤 最短路径用BFS
此博客中代码会WA 但是我不知道为什么 跪求指点
正解见:https://blog.csdn.net/weixin_44339734/article/details/104170937
在这里插入图片描述
两个壶A、B互相倒水 最终要达到其中一个水壶中有C值的水 无法达到输出‘impossible’
在这里插入图片描述

Sample Input
3 5 4
Sample Output
6
FILL(2)
POUR(2,1)
DROP(1)
POUR(2,1)
FILL(2)
POUR(2,1)

错 误 示 范

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <queue>

using namespace std;

struct Node{
	int potA;
	int potB;
	string path;
	int step;
};

int visited[100][100];


int main()
{
	int A,B,C;
	bool found;
	queue<Node> tempQueue;
	scanf("%d %d %d",&A,&B,&C);
		if(C==0)
		{
			cout << 0 <<endl;
			return 0;
		}
		memset(visited,0,10000*sizeof(int));
		Node startNode1,startNode2;
		startNode1.potA=A;
		startNode1.potB=0;
		startNode1.path = "FILL(1)\n";
		startNode1.step=1;
		startNode2.potA=0;
		startNode2.potB=B;
		startNode2.path = "FILL(2)\n";
		startNode2.step=1;
		visited[A][0]=1;
		visited[0][B]=1;
		if(C==A)
		{
			cout << 1<<endl<<startNode1.path;
			return 0;
		}
		if(C==B)
		{
			cout << 1<<endl<<startNode2.path;
			return 0;
		}
		while(!tempQueue.empty())
			tempQueue.pop();
		tempQueue.push(startNode1);
		tempQueue.push(startNode2);
		found = false;
		while(!tempQueue.empty())
		{
			Node tempNode = tempQueue.front();
			tempQueue.pop();
			// A->B
			if(tempNode.potA!=0)
			{
				//dropA
				if(visited[0][tempNode.potB]==0)
				{
					visited[0][tempNode.potB]=1;
					Node newNode;
					newNode.potA=0;
					newNode.potB = tempNode.potB;
					newNode.path = tempNode.path+"DROP(1)\n";
					newNode.step = tempNode.step+1;
					tempQueue.push(newNode);
					if(newNode.potB==C||newNode.potA==C)
					{
						cout << newNode.step << "\n"<<newNode.path;
						found = true;
						break;
					}			
				}
				// B remain > A
				if((B-tempNode.potB)>tempNode.potA)
				{
					if(visited[0][tempNode.potB+tempNode.potA]==0)
					{
						visited[0][tempNode.potB+tempNode.potA]=1;
						Node newNode;
						newNode.potA=0;
						newNode.potB = tempNode.potB+tempNode.potA;
						newNode.path = tempNode.path+"POUR(1,2)\n";
						newNode.step = tempNode.step+1;
						tempQueue.push(newNode);
						if(newNode.potB==C||newNode.potA==C)
						{
							cout << newNode.step << "\n"<<newNode.path;
							found = true;
							break;
						}
					}	
				}
				// B remain <=A
				if((B-tempNode.potB)<=tempNode.potA)
				{
					if(visited[tempNode.potA-B+tempNode.potB][B]==0)
					{
						visited[tempNode.potA-B+tempNode.potB][B]=1;
						Node newNode;
						newNode.potA = tempNode.potA-B+tempNode.potB;
						newNode.potB = B;
						newNode.path = tempNode.path+"POUR(1,2)\n";
						newNode.step = tempNode.step+1;
						tempQueue.push(newNode);
						if(newNode.potB==C||newNode.potA==C)
						{
							cout << newNode.step << "\n"<<newNode.path;
							found = true;
							break;
						}
					}
				}
			}
			//B->A
			if(tempNode.potB!=0)
			{
				//dropB
				if(visited[tempNode.potA][0]==0)
				{
					visited[tempNode.potA][0]=1;
					Node newNode;
					newNode.potA = tempNode.potA;
					newNode.potB=0;
					newNode.path = tempNode.path+"DROP(2)\n";
					newNode.step = tempNode.step+1;
					tempQueue.push(newNode);
					if(newNode.potB==C||newNode.potA==C)
					{
						cout << newNode.step << "\n"<<newNode.path;
						found = true;
						break;
					}			
				}
				
				// A remain > B
				if((A-tempNode.potA)>tempNode.potB)
				{
					if(visited[tempNode.potB+tempNode.potA][0]==0)
					{
						visited[tempNode.potB+tempNode.potA][0]=1;
						Node newNode;
						newNode.potA = tempNode.potB+tempNode.potA;
						newNode.potB = 0;
						newNode.path = tempNode.path+"POUR(2,1)\n";
						newNode.step = tempNode.step+1;
						tempQueue.push(newNode);
						if(newNode.potA==C||newNode.potB==C)
						{
							cout << newNode.step << "\n"<<newNode.path;
							found = true;
							break;
						}
					}	
				}
				// A remain <=B
				if((A-tempNode.potA)<=tempNode.potB)
				{
					if(visited[A][tempNode.potB-A+tempNode.potA]==0)
					{
						visited[A][tempNode.potB-A+tempNode.potA]=1;
						Node newNode;
						newNode.potA = A;
						newNode.potB = tempNode.potB-A+tempNode.potA;
						newNode.path = tempNode.path+"POUR(2,1)\n";
						newNode.step = tempNode.step+1;
						tempQueue.push(newNode);
						if(newNode.potB==C||newNode.potA==C)
						{
							cout << newNode.step << "\n"<<newNode.path;
							found = true;
							break;
						}
					}
				}
			}
			// fillA
			if(tempNode.potA!=A)
			{
				if(visited[A][tempNode.potB]==0)
				{
					visited[A][tempNode.potB]=1;
					Node newNode;
					newNode.potA = A;
					newNode.potB = tempNode.potB;
					newNode.path = tempNode.path+"FILL(1)\n";
					newNode.step = tempNode.step+1;
					tempQueue.push(newNode);
					if(newNode.potA==C||newNode.potB==C)
					{
						cout << newNode.step << "\n"<<newNode.path;
						found = true;
						break;
					}
				}
				
			}
			// fillB
			if(tempNode.potB!=B)
			{
				if(visited[tempNode.potA][B]==0)
				{
					visited[tempNode.potA][B]=1;
					Node newNode;
					newNode.potA = tempNode.potA;
					newNode.potB = B;
					newNode.path = tempNode.path+"FILL(2)\n";
					newNode.step = tempNode.step+1;
					tempQueue.push(newNode);
					if(newNode.potA==C||newNode.potB==C)
					{
						cout << newNode.step << "\n"<<newNode.path;
						found = true;
						break;
					}
				}
			}
		}
		if(!found)
			cout << "impossible"<<endl;
	
	return 0;
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值