**實現
題目背景
輸入輸出已更改,請不要直接提交原先的**。
題目描述
假定兩個水壺a和b,供水量不限。可以使用三種方法裝水:
給乙個水壺裝水;
把乙個水壺倒空;
從乙個水壺倒進另乙個水壺。
當從乙個水壺倒進另乙個水壺時,如果第乙個水壺倒空,或者第二個水壺裝滿就不能再倒了。例如,乙個水壺a是5加侖和另乙個水壺b是6加侖,水量是8加侖,則從水壺a倒進水壺b時,讓水壺b充滿水而水壺a剩3加侖水。
問題由3個引數:c_a,c_b 和n,分別表示水壺a和b的容量,目標水量n。解決問題的目標是,給出一系列倒水的步驟,使水壺b中的水量恰好是n。
輸入輸出格式
輸入格式:
第一行為資料組數t。
接下來的tt行,每行三個數字c_ac,c_b和n,意義如題目所示。t不超過30300輸出格式:
輸出共為t行,第乙個數字為要達成的完成次數a_i (題目保證存在解)。
接下來a_i個數字,表示各種操作:
做這個題,首先想到的應是深搜,寬搜,但是本人認為用寬搜更直白一些。
當然,兩種方法都行。首先,是兩個水壺a和b。用乙個二維陣列來記錄水壺a,b的情況,(注:資料範圍大,最好開乙個比較大的陣列)。
按照題目中所給的資訊,我們必須按照六個步奏依次進行,如圖:
如圖可知,**的基本結構為:
if(!vis[ca][b])
if(!vis[a][cb])
if(!vis[0][b])
if(!vis[a][0])
int c=a+b>ca?ca:a+b;
if(!vis[c][a+b-c])
c=a+b>cb?cb:a+b;
if(!vis[a+b-c][c])
當然,這樣寫可以把六種情況一一枚舉,(其他的那個變數就自己去想了(~ ̄▽ ̄)~ ),按照描述,我們根據他便可以將bfs不斷擴充套件下去,最後等水量為n的時候,就完了。
可能你會嫌**量大,( ̄へ ̄),但你可以參照下面的方式:
int fd=a+b>ca?ca:a+b;//b->a
int fg=a+b>cb?cb:a+b;//a->b
const int dir[6][3]=,
, ,, ,
,};for(int i=0;i<6;i++)
}
好了(( ̄. ̄)),我就不多說了,至於dfs的,可以自己去上網查查,也可以去洛谷,最後——
#include using namespace std;
int ca,cb,n;
bool vis[4000][4000];
struct node
node(int qa,int qb,string ss)
};queuequ;
void bfs()
c=a+b>cb?cb:a+b;
if(!vis[a+b-c][c])
} return;
}int main()
return 0;
}
抄襲者,死無對證。 倒水問題 (codevs 1226) 題解
問題描述 有兩個無刻度標誌的水壺,分別可裝x公升和y公升 x,y 為整數且均不大於100 的水。設另有一水缸,可用來向水壺灌水或接從水壺中倒出的水,兩水壺間,水也可以相互傾倒。已知x公升壺為空壺,y公升壺為空壺。問如何通過倒水或灌水操作,用最少步數能在x或y公升的壺中量出 z z 100 公升的水來...
倒水問題 (codevs 1226) 題解
有兩個無刻度標誌的水壺,分別可裝x公升和y公升 x,y 為整數且均不大於100 的水。設另有一水缸,可用來向水壺灌水或接從水壺中倒出的水,兩水壺間,水也可以相互傾倒。已知x公升壺為空壺,y公升壺為空壺。問如何通過倒水或灌水操作,用最少步數能在x或y公升的壺中量出 z z 100 公升的水來。3 22...
P1582 倒水 題解
來水一發水題。題目鏈結。正解開始 首先,我們根據題意,可以得知這是乙個有關二進位制的題目 具體什麼關係,怎麼做,我們來具體分析 對於每個n,我們嘗試將其二進位制分解,也就是100101之類的形式 根據瓶子合併的特性,我們可以判定最後每乙個瓶子內的水都可以表示成2 i的形式 感性理解 對於每乙個數字上...