首页 > 其他分享 >Poj 3414 Pots (BFS+回溯+队列)

Poj 3414 Pots (BFS+回溯+队列)

时间:2024-02-03 14:46:15浏览次数:25  
标签:aa bb vis Pots next BFS start 3414

这道题需要输出最后结果的执行过程,可以通过结构体,在结构体中定义一个数组s,s中存储了每一步的执行过程,实现了回溯。并且在运行中可以适当剪枝,减少枚举次数。

 

#include<iostream> 
#include<queue>
#include<cstring>
using namespace std;
const int N=110;
int aa,bb,cc,vis[N][N];
struct node{
    int a,b,step,s[N];
};
void BFS(){
    memset(vis,0,sizeof(vis));
    queue<node> q;
    node start;
    start.a=0;
    start.b=0;
    start.step=0;
    vis[start.a][start.b]=1;
    q.push(start);
    while(!q.empty()){
        start=q.front();
        q.pop();
        if(start.a==cc || start.b==cc){
            cout<<start.step<<endl;
            for(int i=0;i<start.step;i++){
                switch(start.s[i]){
                    case 1: cout<<"FILL(1)"<<endl;break;
                    case 2: cout<<"FILL(2)"<<endl;break;
                    case 3: cout<<"DROP(1)"<<endl;break;
                    case 4: cout<<"DROP(2)"<<endl;break;
                    case 5: cout<<"POUR(1,2)"<<endl;break;
                    case 6: cout<<"POUR(2,1)"<<endl;break;
                }
            }
            return ;
        }else{
            node next;
            for(int i=1;i<=6;i++){
                next=start;
                next.s[next.step++]=i;
                if(i==1 && next.a!=aa) next.a=aa;
                else if(i==2 && next.b!=bb)next.b=bb;
                else if(i==3 && next.a) next.a=0;
                else if(i==4 && next.b) next.b=0;
                else if(i==5 && next.a && next.b!=bb){
                    if(next.a+next.b>bb){
                        next.a=next.a+next.b-bb;
                        next.b=bb;
                    }else{
                        next.b=next.a+next.b;
                        next.a=0;
                    }
                }else if(i==6 && next.b && next.a!=aa){
                    if(next.a+next.b>aa){
                        next.b=next.a+next.b-aa;
                        next.a=aa;
                    }else{
                        next.a=next.a+next.b;
                        next.b=0;
                    }
                }
                if(vis[next.a][next.b]) continue;
                vis[next.a][next.b]=1;
                q.push(next); 
            }    
        }
    }
    cout<<"impossible"<<endl;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>aa>>bb>>cc;
    BFS();
    return 0;
}

 

标签:aa,bb,vis,Pots,next,BFS,start,3414
From: https://www.cnblogs.com/accbulb/p/18004769

相关文章

  • Poj 3278 Catch That Cow (BFS+队列)
    #include<iostream>#include<queue>#include<cstring>usingnamespacestd;constintN=1e5+10;intn,k,line[N],way;structnode{intloc,step;};queue<node>q;voidBFS(intn,intk){while(!q.empty())q.pop();nodestart,next......
  • Poj3126 Prime Path (BFS+筛素数)
    #include<iostream>#include<queue>#include<cstring>constintN=10010;intt,aa,bb,prime[N],vis[N],step[N];usingnamespacestd;voidprime_(){//埃式筛法prime[0]=prime[1]=1;for(inti=2;i<10000;i++){if(prime[i])contin......
  • 状压+BFS
    洛谷2622思路定义一个结构体节点,分别存储状态和步骤,状态的某一位是1表示灯开着,是0则表示该灯关,当状态为0000时输出的步骤即为最小步骤。点击查看代码#include<bits/stdc++.h>usingnamespacestd;//#defineintlonglong#definelllonglonginta[120][102]={0};int......
  • leetcode--98. 验证二叉搜索树(bfs)
    记录13:502024-1-28https://leetcode.cn/problems/validate-binary-search-tree/想岔方向了,想的太复杂了。首先思路是每个root节点必须大于左子树的最大节点,小于右边子树的最小节点。我的做法是记录下叶子节点,因为左边叶子节点的集合(vector)的最后一个节点为左子树的最大值......
  • POJ2627 数独 (dfs or bfs)
    POJ2627数独(dfsorbfs)给出一个数独,空白用0表示,输出一个合理答案即可;SampleInput1103000509002109400000704000300502006060000050700803004000401000009205800804000107SampleOutput1436285795721394689867542313915427864689173527258639142374816956......
  • 搜索学习笔记+杂题 (进阶二 dfs/bfs的进阶)
    前言:由于搜索的题还是做的太少了,所以以后有可能会不定期更新。四、还是进阶的dfs/bfs相关题单:戳我1、dfs(1)meetinthemiddleP2962[USACO09NOV]LightsG颠覆了我对折半搜索的认知,果然,只要满足了折半搜索的几个性质,基本上都可以使用折半搜索来处理。首先我们拿到的是一张......
  • 搜索学习笔记+杂题 (进阶一 dfs/bfs的进阶)
    前言:没啥好说的了。所以只能来写博客了。搜索杂题:相关题单:戳我二、进阶dfs/bfs1、dfs进阶——折半搜索(meetinthemiddle)由于深搜的时间复杂度在每种状态有两个分支的情况下是\(O(2^n)\)。所以一般暴力深搜的数据范围就在\(20-25\)之间。而对于有一大类的题,它的搜索思......
  • 搜索学习笔记+杂题 (基础二 dfs/bfs的拓展)
    搜索杂题:博客中讲述的题的题单:戳我二、dfs/bfs的各种变式1、深搜深搜以指数级的时间复杂度闻名,稍不注意时间就会爆炸,所以一般会用到剪枝的技巧(这个技巧基本上是因题而异,需要平时的刷题与积累)。深搜同样也是一种可变性极高的算法(其实都可以不叫做一种算法,深搜已经是一种做题的......
  • BFS-走迷宫
    1.题目简单概述:走迷宫问题,行走的方向是上下左右。这个迷宫内有些格子不能走,想要从迷宫的左上角走到右下角,最少移动次数。这道题属于最短路问题(求出到达一个点的最短路径)。思路分析为什么使用BFS求到的答案能保证是最短的路径?因为BFS是逐层搜索的,能把当前层的所有可能值包......
  • 图(树)的广度优先遍历bfs
    图的广度优先遍历广度优先遍历,就是在遍历时优先考虑遍历的广度,不像深度优先那样一条路径遍历到底,而是一层一层的遍历。由于广度优先是一层一层节点的遍历,在图的边权值都为1的情况下,若我们要求出节点a到节点b的最短路,就可以以a为源点(source)进行广搜,当a第一次搜到b时,其路径一......