NYOJ21 三個水杯

2021-06-13 15:43:13 字數 1395 閱讀 8935

題目分析:

暴力+bfs。將所有可能的狀態壓到佇列中,直到找到目標狀態為止。

我自己ac的**。

#include#include//三個水杯的盛水的狀態

struct node

;node queue[100];

bool used[101][101][101];

inline void pour(node p,int &tail)

}inline int min(const int a, const int b)

//尋找倒水路徑

int pourwatertwo(int *goal, int *vol)

if(s.c < vol[2])

}//將2倒入1或3中

if(s.b > 0)

if(s.c < vol[2])

}if(s.c > 0)//將3倒入1,2中

if(s.b < vol[1])

}++head;

} return -1;

}int main()

if(goal[0] == vol[0] && !goal[1] && !goal[2])

printf("%d\n",pourwatertwo(goal,vol));

}}

oj上的最優**,當時我寫的時候就在想怎麼優化,其實想到了一點點,不過還是太弱了,最終沒有搞出來。看看大牛的作品。

#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 三個水杯

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

nyoj21三個水杯。。

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

NYOJ 21 三個水杯

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