已知有三个容量分别为1斤、7两和3两的并且是没有刻度的酒瓶,1斤的瓶子装满了酒,而7两和三两的瓶子为空。现要求将这些酒分出5两出来。
BFS:
#include<iostream>
#include<stdio.h>
#include<map>
#include<vector>
#include<queue>
#include<set>
#include<cstdlib>
#include<string.h>
#include<algorithm>
#include<cmath>
#define MAXN 1000010
#define EPS 1e-9
using namespace std;
struct node{
int a;//对应容量为一斤的瓶子里当前所装的酒量
int b;//对应容量为七两的瓶子里当前所装的酒量
int c;//对应容量为三两的瓶子里当前所装的酒量
int pre;//父节点id
int id;//节点id
string str;//记录该状态对应的操作
}state[1000010];
int vis[100][100][100];
int cnt;
int num;
int ids[1000];
/****************************************
BFS函数说明:枚举各种倒满方案,依次进行广搜
参数:v1,v2,v3依次为瓶子容量,a,b,c为所装酒量,x为要称出的酒量
********************************************/
int BFS(int v1,int v2,int v3,int a,int b,int c,int x)
{
int fg=-1;
num=0;
queue<node>q;
memset(vis,0,sizeof(vis));
node cur,nex;
cur.a=a;
cur.b=b;
cur.c=c;
cur.str="";
cur.pre=cur.id=0;
q.push(cur);
vis[a][b][c]=1;
cnt=0;
state[cnt]=cur;
while(!q.empty())
{
cur=q.front();
q.pop();
if(cur.a==x||cur.b==x||cur.c==x)//找到解
{
fg=1;
ids[++num]=cur.id;
continue;
//return cur.id;
}
e