nyoj21三個水杯。。

2021-06-27 04:45:06 字數 2064 閱讀 3445

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度:4 描述

給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其餘兩個為空杯子。三個水杯之間相互倒水,並且水杯沒有標識,只能根據給出的水杯體積來計算。現在要求你寫出乙個程式,使其輸出使初始狀態到達目標狀態的最少次數。

輸入第一行乙個整數n(0v2>v3 v1<100 v3>0)表示三個水杯的體積。

第二行給出三個整數e1 e2 e3 (體積小於等於相應水杯體積)表示我們需要的最終狀態

輸出每行輸出相應測試資料最少的倒水次數。如果達不到目標狀態輸出-1

樣例輸入

2

6 3 1

4 1 1

9 3 2

7 1 1

樣例輸出

3

-1

廣搜的題目~一開始看著沒什麼思路,後來理解之後就顯得簡單多了,除了wrong answer之外也就沒什麼了。

主要就是三個水杯互相倒水的問題~

覺得有了這張圖就很好理解了~每次互相倒水,判斷出現狀態是否重複~

;int cup[3]; //水杯的容量

int end_water[3]; //結束狀態

int vis[101][101][101]; //標記陣列

int ok(node succeed) //判斷結束

return 1;

}int bfs()

int i, j;

for(i=0; i<3; i++)

else

q.step = p.step + 1;

if(vis[q.water[0]][q.water[1]][q.water[2]] == 0)}}

}}return -1;

}int main()

for(i=0; i<3; i++)

printf("%d\n", bfs());

}return 0;

}說下需要注意的地方,也是我丟三落四容易落下的地方:1,標記陣列的清空  2,就是佇列的設定,要是全域性的佇列就要記得清空,不想每次都清空酒把佇列設成區域性的~嗯,就這樣!

貼最優**

#include#include#include#include#includeusing namespace std;

#define clr(arr,val) memset(arr,val,sizeof(arr))

bitset<1000000> hash;

const int max_step=100000;

int wq[max_step][4],goal[3],cap[3],goalval;

int head=0,tail=0;

void movw(int numfrom,int numto,int other)

else

int hashval=wq[tail][0]*10000+wq[tail][1]*100+wq[tail][2];

if(hashval==goalval) throw wq[head][3]+1;

if(wq[head][numfrom]!=0 && !hash[hashval]) }

int main()

wq[tail][0]=cap[0];wq[tail][1]=0;wq[tail][2]=0;wq[tail][3]=0;

++tail;

tryputs("-1");

}catch(int step)}}

NYOJ21 三個水杯

題目分析 暴力 bfs。將所有可能的狀態壓到佇列中,直到找到目標狀態為止。我自己ac的 include include 三個水杯的盛水的狀態 struct node node queue 100 bool used 101 101 101 inline void pour node p,int ta...

NYOJ21 三個水杯

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其餘兩個為空杯子。三個水杯之間相互倒水,並且水杯沒有標識,只能根據給出的水杯體積來計算。現在要求你寫出乙個程式,使其輸出使初始狀態到達目標狀態的最少次數。輸入第一行乙個整數...

NYOJ 21 三個水杯

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其餘兩個為空杯子。三個水杯之間相互倒水,並且水杯沒有標識,只能根據給出的水杯體積來計算。現在要求你寫出乙個程式,使其輸出使初始狀態到達目標狀態的最少次數。輸入第一行乙個整數...