BFS从起点推到终点得总步数
#include <queue>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <unordered_set>
using namespace std;
string s = "9000"; //起点
string res; //终点
char math[] = {'9', '7', '4', '2'}; //饱和状态
unordered_set<string> S;
int main()
{
cin >> res;
int cnt = 0;
for(int i = 0; res[i]; i ++ )
if(res[i] > math[i] || i > 3)
cnt = -1;
if(cnt == -1)
{
cout << cnt << endl;
return 0;
}
queue<string> q;
q.push(s);
S.insert(s);
while(q.size())
{
int len = q.size();
//当前层数的所有状态
for(int k = 0; k < len; k ++ )
{
auto t = q.front(); q.pop();
if(t == res)
{
cout << cnt << endl;
return 0;
}
//拓展状态,每个酒瓶都可以往另外3个倒酒
for(int i = 0; i < 4; i ++ )
{
for(int j = 0; j < 4; j ++ )
{
if(i == j) continue;
auto tt = t;
//tt[i] -> tt[j]倒酒
if(tt[i] == '0') continue; //没酒可以倒
if(tt[j] == math[j]) continue; //另一个瓶子满了
//倒完或者倒满另一个瓶子
int v = min(tt[i] - '0', math[j] - tt[j]);
tt[i] -= v;
tt[j] += v;
//判重状态,没有就直接入队
if(S.count(tt)) continue;
S.insert(tt);
q.push(tt);
}
}
}
cnt ++; //层数加1
}
puts("-1");
return 0;
}