码迷,mamicode.com
首页 > 其他好文 > 详细

计蒜客--无脑博士的试管们

时间:2018-10-30 13:08:25      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:搜索   anti   防止   tps   之间   cin   重复   while   ==   

题目链接:https://nanti.jisuanke.com/t/31

题意:三只试管的容量分布是A、B、C,现在A,B两个试管是空的,C试管是满的,试管之间可以倒来倒去,求当A试管是空的时候,C试管中试剂的体积

题解:把所有情况深搜,记忆化数组防止重复搜索,比较经典的DFS

代码如下:

#include<bits/stdc++.h>
using namespace std;
int A,B,C;
int vis[25][25][25];
vector<int> ans;
void dfs(int a,int b,int c){
    if(vis[a][b][c]) return;
    vis[a][b][c]=1;
    if(a==0) ans.push_back(c);
    //把a杯子的水放进b杯子
    if(a<=B-b) dfs(0,a+b,c);
    else dfs(a+b-B,B,c);
    //把b杯子的水放进a杯子
    if(b<=A-a) dfs(a+b,0,c);
    else dfs(A,a+b-A,c);
    //把a杯子的水放进c杯子
    if(a<=C-c) dfs(0,b,a+c);
    else dfs(a+c-C,b,C);
    //把c杯子的水放进a杯子
    if(c<=A-a) dfs(a+c,b,0);
    else dfs(a,b+c-C,C);
    //把b杯子的水放进c杯子
    if(b<=C-c) dfs(a,0,b+c);
    else dfs(a,b+c-C,C);
    //把c杯子的水放进b杯子
    if(c<=B-b) dfs(a,b+c,0);
    else dfs(a,B,b+c-B);
}

int main(){
    while(cin>>A>>B>>C){
        memset(vis,0,sizeof(vis));
        ans.clear();
        dfs(0,0,C);
        sort(ans.begin(),ans.end());
        for(int i=0;i<ans.size();i++){
            printf("%d%c",ans[i],i==ans.size()-1?\n: );
        }
    }
}

 

计蒜客--无脑博士的试管们

标签:搜索   anti   防止   tps   之间   cin   重复   while   ==   

原文地址:https://www.cnblogs.com/buerdepepeqi/p/9876115.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!