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的主要内容,如果未能解决你的问题,请参考以下文章

2021-06-01

2021-06-01

2021-06-01

2021-06-01

2021-06-01

刷题LeetCode刷刷刷 — 2021-06-01