題目分析:
暴力+bfs。將所有可能的狀態壓到佇列中,直到找到目標狀態為止。
我自己ac的**。
oj上的最優**,當時我寫的時候就在想怎麼優化,其實想到了一點點,不過還是太弱了,最終沒有搞出來。看看大牛的作品。#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));
}}
#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 描述 給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其餘兩個為空杯子。三個水杯之間相互倒水,並且水杯沒有標識,只能根據給出的水杯體積來計算。現在要求你寫出乙個程式,使其輸出使初始狀態到達目標狀態的最少次數。輸入第一行乙個整數...