1. 程式人生 > >倒水問題題解(勿噴)

倒水問題題解(勿噴)

倒水問題

總時間限制:
1000ms
記憶體限制:
65536kB
描述

有三個分別容量分別為a升、b升和c升的杯子(a>b>c>0,且b與c互質)。

a杯裝滿水,b與c均為空。

三個筒相互倒水且不準把水倒往三個筒之外。

請用最少的倒水次數,倒出d升水(任一杯中正好水量為d 即可),並輸出倒水的過程。

輸入
只有一行:a、b、c、d 四個整數。
輸出
第一行為倒水過程的總步驟 N ,其後N行為倒水的過程;
若無解,則輸出“No find”。
樣例輸入
10 7 3 4
樣例輸出
3
10 0 0
3 7 0
3 4 3 
明顯的廣搜,這裡把vector、queue、stack都用了一遍
#include
<cstdio> #include <queue> #include <stack> #include <vector> #include <algorithm> #include <iostream> #include <cstdlib> using namespace std; //結構體 structnode { int v[3]; int f; }; //全域性變數 const int maxn=200+5; int a,b,c,d; bool tf[maxn][maxn]; int cap[3]; vector <
node> vec; bool isok(int i) { return vec[i].v[0]==d||vec[i].v[1]==d||vec[i].v[2]==d; } void out(int i) { int j; stack<int>sta; do { sta.push(i); if(vec[i].f!=i) i=vec[i].f; else break; }while(1) ; printf("%d\n",sta.size() ); while(!sta.empty()) { j=sta.top() ;sta.pop() ; printf
("%d %d %d\n",vec[j].v[0],vec[j].v[1],vec[j].v[2]); } } void work(int a,int b,int c,int d) { //初始化 for(int i=0;i<maxn;i++) for(int j=0;j<maxn;j++) tf[i][j]=false; vec.clear() ; //準備 queue<int>que; int curr,ii; cap[0]=a; cap[1]=b; cap[2]=c; nodes; if(a<d) { printf("No find");return; } s.v[0]=a;s.v[1]=0;s.v[2]=0;s.f =0; vec.push_back(s); if(isok(0)) { printf("1\n%d 0 0",a);return; } tf[a][0]=true; que.push(0); //開始 while(!que.empty()) { curr=que.front(); que.pop() ; for(int i=0;i<3;i++) for(int j=0;j<3;j++) { //i->j // printf("** "); if(i==j||vec[curr].v[i]==0||vec[curr].v[j]==cap[j]) continue; // printf("44 "); ii=min(cap[j]-vec[curr].v[j],vec[curr].v[i]); s.f =curr; for(int o=0;o<3;o++) s.v [o]=vec[curr].v[o]; s.v[i]-=ii; s.v[j]+=ii; if(!tf[s.v[0]][s.v[1]]) { tf[s.v[0]][s.v[1]]=true; vec.push_back(s); if(isok(vec.size()-1)) { out(vec.size()-1); return; } que.push(vec.size() -1) ; } } } printf("No find"); } int main() { scanf("%d%d%d%d",&a,&b,&c,&d); work(a,b,c,d); return 0; }

相關推薦

倒水問題題解

倒水問題 總時間限制: 1000ms記憶體限制: 65536kB描述 有三個分別容量分別為a升、b升和c升的杯子(a>b>c>0,且b與c互質)。 a杯裝滿水,b與c均為空。 三個筒相互倒水且不準把水倒往三個筒之外。 請用最少的倒水次數,倒出d升水(任

團體程式設計天梯賽-習題集部分題解大牛

Group program design ladder match - practice set.L1-001. 列印沙漏 時間限制  400 ms    記憶體限制  65536 kB    程式碼長度限制  8000 B本題要求你寫個程式把給定的符號列印成沙漏的形狀

華碩筆記本使用老毛桃工具迅速重灌系統動作快估計就二十分鐘,高手

華碩筆記本使用老毛桃工具迅速重灌系統(動作快估計就二十分鐘) 1.前期準備 (1)下載老毛桃的工具(2)一個大於3.5G的U盤(3)下載ISO映象檔案(如win7 64bit就下載cn_windows

強迫症終結版 - 蹩腳梨視訊下載器很菜

強迫症終結版 - 蹩腳梨視訊下載器 支援功能: 自己選擇要下載的視訊分類 視訊個數(12的倍數,最新的...個)(不要怪不能高度自定義啦~) 重複檔案自動跳過 選單會被控制檯列印頂掉,大家見諒(才疏學淺 暫不知道咋改(等視訊都下完了再列印選單)) 哎,舒服了~ 強調:僅供學習練習用,請不要亂來 #

線段樹題解3題

integer pre contain 恰恰 sam 編號 更改 splay article A - 敵兵布陣 C國的死對頭A國這段時間正在進行軍事演習,所以C國間諜頭子Derek和他手下Tidy又開始忙乎了。A國在海岸線沿直線布置了N個工兵營地,Derek和Tidy的

題解——洛谷P2734 遊戲A Game 題解區間DP

表示 training 代碼 clas rain region str 所有 sample 題面 題目背景 有如下一個雙人遊戲:N(2 <= N <= 100)個正整數的序列放在一個遊戲平臺上,遊戲由玩家1開始,兩人輪流從序列的任意一端取一個數,取數後該數字

洛谷P1484 種樹&洛谷P3620 [APIO/CTSC 2007]資料備份 題解堆+貪心

洛谷P1484 種樹&洛谷P3620 [APIO/CTSC 2007]資料備份 題解(堆+貪心) 標籤:題解 閱讀體驗:https://zybuluo.com/Junlier/note/1329957 題目連結地址: 洛谷P1484 種樹 洛谷P3620 [APIO/CTSC 2007]資料備份(

洛谷P2507 [SCOI2008]配對 題解dp+貪心

洛谷P2507 [SCOI2008]配對 題解(dp+貪心) 標籤:題解 閱讀體驗:https://zybuluo.com/Junlier/note/1299251 連結題目地址:洛谷P2507 [SCOI2008]配對 感覺是道很好的推斷題 貪心 想到貪心的結論就很容易,沒想到就很難做出來了 結論

P1725 琪露諾 題解單調佇列

題目連結 琪露諾 解題思路 單調佇列優化的\(dp\)。 狀態轉移方程:\(f[i]=max{f[i-l],f[i-l+1],...,f[i-r-1],f[i-r]}+a[i]\) 考慮單調佇列優化。 因為剛學,不是很熟悉單調佇列,特寫一篇詳細的解釋。 \(queue\) 陣列儲存一個佇列,他的頭部和尾

input輸入框驗證郵箱,身份證號碼,手機號碼(為了加深記憶,菜鳥,

<form action="">   輸入:<input type="text" name="idcard" id="idcard" placeholder="請輸入郵箱">   <input type="button" value="驗證" onclick="chec

NOIP2018D1T2題解亂搞

Day1 T2 貨幣系統 原題面: 在網友的國度中共有 n種不同面額的貨幣,第 i 種貨幣的面額為 $a_i$,你可以假設每一種貨幣都有無窮多張。為了方便,我們把貨幣種數為 n,面額陣列為 $a_{1..n}$ 的貨幣系統記作 (n,a)。 在一個完善的貨幣系統中,每一個非負整數的金額 xx 都應該可以

P2188 小Z的 k 緊湊數 題解數位DP

題目連結 小Z的 k 緊湊數 解題思路 數位DP,把每一個數位的每一個數對應的可能性表示出來,然後求\(num(1,r)-num(1,l-1)\),其中\(num(i,j)\)表示\([i,j]\)區間裡符合要求的數的個數。 其中,\(dp[i][j]\)表示第\(i\)位數字為\(j\)的選擇種數。

P2766 最長不下降子序列問題 題解網路流

題目連結 最長不下降子序列問題 解題思路 分成三小問解決。 第一小問,求\(LIS\),因為\(n<=500\),直接\(O(N^2)\)暴力求解即可。 第二三小問,建立模型用網路流求解。 對於第二小問 \((1)\)首先,因為每個點只能使用一次,考慮拆點,把每一個點拆成\(i,n+i\)兩個點,

資料結構---迷宮問題題解C語言

資料結構—迷宮問題題解(C語言) #include<stdio.h> #include<stdlib.h> #define FALSE 0 #define TRUE 1 #define OK 1 #define M 20

P4285 [SHOI2008]漢諾塔 題解 亂搞

題目連結 P4285 [SHOI2008]漢諾塔 解題思路 提供一種打表新思路 先來證明一個其他題解都沒有證明的結論:\(ans[i]\)是可由\(ans[i-1]\)線性遞推的。 (\(ans[i]\)表示\(i\)個盤子全部移走的步數) 感謝keytoyzi神仙的神仙思路 首先,在最初兩

半年oi回憶錄

感慨 tro 人的 競爭 數學 難受 也有 noip 高中 目錄 半年oi回憶錄 起點 轉折 啟程 初醒 結束 半年oi回憶錄 不知道改寫什麽才好,默默的在後排電腦敲一會回憶錄吧 就從剛開始的夢想談起吧 起點 對於一個中學就讀在鄉村中學的人來說,沒有什麽太大的理想,只

P2014 選課 題解樹形DP

show dfs for 建圖 sca () 包括 ems 遍歷 題目鏈接 P2014 選課 解題思路 樹形動歸,用\(f[i][j]\)表示以\(i\)為根,\(j\)個子節點(不包括自己)的最大學分 首先根據題意建圖,用根節點\(0\)將森林連成樹。 從根節點開始\(D

redis的相關原理

Redis 資料型別 Redis支援五種資料型別:string(字串),hash(雜湊),list(列表),set(集合)及zset(sorted set:有序集合)。     使用redis有什麼缺點   分析:大家用redis

PAT甲級真題題解更新中

2018年11月17日 13:27:17 Czq6666 閱讀數:9 標籤: pat甲級 資料結構

Codeforces 部分題目題解口胡

883D 題面 題目大意:給你一個長度為n的字串,上面有牛(“P”),草(“*”)和空地(“.”)。現在你給每一頭牛規定一個方向,它會一直往前吃草,直到走到邊界。每一份草只會被吃1次,要求輸出最多吃多少草,以及在此基礎下吃完最後一份草的最小時間。n<=