題解 倒水問題

2021-09-10 23:32:00 字數 1640 閱讀 7163

**實現

題目背景

輸入輸出已更改,請不要直接提交原先的**。

題目描述

假定兩個水壺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的形式 感性理解 對於每乙個數字上...