2021-06-01
Posted 偶尔爆零的蒟蒻
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-06-01相关的知识,希望对你有一定的参考价值。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
#include<stack>
using namespace std;
#define ff first
#define ss second
#define ms(a,x) memset(a,x,sizeof(a))
#define rush() int T;scanf("%d",&T);while(T--)
#define pb push_back
#define mp make_pair
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
#define inf 0x3f3f3f3f //10 6110 9567<2^30=10 7374 1824
const double pi=acos(-1.0);
const double eps=1e-9;
const int mod=9901;
const int MAX=1e4;
#define ls(x) x<<1
#define rs(x) x<<1|1
struct cup{
int a,b;
int step;
char way[105];//由哪个状态转来的
cup(){}
cup(int x,int y,int z):a(x),b(y),step(z){}
bool operator<(const cup& c)const{//随便比较一下
return step<c.step;
}
};
map<cup,cup> m;
int a,b,c;
bool judge[105][105];//用过的状态
int t;
void out(cup c){
if(m.find(c)==m.end())return;
out(m[c]);
if(m[c].way[0]!='f')
cout<<m[c].way<<endl;
}
void bfs(){
cup cp(0,0,0);
strcpy(cp.way,"f");//特判初始信息
//m[cp]={-1,-1,-1};
judge[0][0]=true;
queue<cup> q;
q.push(cp);
bool flag=false;
while(!q.empty()&&!flag){
cup f=q.front();
q.pop();
if(f.a==c||f.b==c){
flag=true;
cout<<f.step<<endl;
out(f);
cout<<f.way<<endl;
break;
}
cup s=f;
s.step++;
//装满a 代号0
if(f.a<a){
s.a=a;
s.b=f.b;
if(!judge[s.a][s.b]){
s.way[s.step]=0;
judge[s.a][s.b]=true;
char cy[]="FILL(1)";//信息
strcpy(s.way,cy);
m[s]=f;q.push(s);
}
}
//装满b 代号1
if(f.b<b){
s.b=b;
s.a=f.a;
if(!judge[s.a][s.b]){
s.way[s.step]=1;
judge[s.a][s.b]=true;
char cy[]="FILL(2)";
strcpy(s.way,cy);
m[s]=f;q.push(s);
}
}
//倒掉a 代号2
if(f.a){
s.a=0;
s.b=f.b;
if(!judge[s.a][s.b]){
s.way[s.step]=2;
judge[s.a][s.b]=true;
char cy[]="DROP(1)";
strcpy(s.way,cy);
m[s]=f;q.push(s);
}
}
//倒掉b 代号3
if(f.b){
s.b=0;
s.a=f.a;
if(!judge[s.a][s.b]){
s.way[s.step]=3;
judge[s.a][s.b]=true;
char cy[]="DROP(2)";
strcpy(s.way,cy);
m[s]=f;q.push(s);
}
}
//a->b 代号4
if(f.a&&f.b<b){
s.a=max(0,f.a-b+f.b);
s.b=f.a-s.a+f.b;
if(!judge[s.a][s.b]){
s.way[s.step]=4;
judge[s.a][s.b]=true;
char cy[]="POUR(1,2)";
strcpy(s.way,cy);
m[s]=f;q.push(s);
}
}
//b->a 代号5
if(f.b&&f.a<a){
s.b=max(0,f.b-a+f.a);
s.a=f.b-s.b+f.a;
if(!judge[s.a][s.b]){
s.way[s.step]=5;
judge[s.a][s.b]=true;
char cy[]="POUR(2,1)";
strcpy(s.way,cy);
m[s]=f;q.push(s);
}
}
}
if(!flag)cout<<"impossible"<<endl;
}
int main(){
cin>>a>>b>>c;
bfs();
}
以上是关于2021-06-01的主要内容,如果未能解决你的问题,请参考以下文章