題意:給你3個杯子,容量分別為s,n,m,其中s=n+m,三個數都是正整數.一開始s是滿的,n和m都是空的,杯子都沒刻度.最少倒幾次能使其中兩個杯子平分可樂.這道題是個bfs的入門題,解法很容易想到:
在此,主要用這個題練練stl:如何用stl方便地幫助搜尋
注意:下面這種tuple、map的用法,在某些搜尋的情景下是低效的,完全可以用struct和三維陣列高效代替,此處只是練習stl
1. 表示當前可樂容量狀態的三元組:
可以用含有三個元素的結構體儲存狀態,並且把它入隊.stl裡的tuple可以方便地儲存乙個多元組,這樣就不用結構體啦:
定義乙個三元組:
tuplehead;
獲取該狀態下的三個元素:
x=get<0>(head); y=get<1>(head); z=get<2>(head);
給這個組新增元素,比如s,0,0:
head=make_tuple(s,0,0);
2. 當前可樂容量狀態對應的已經進行的傾倒次數:
自然而然想到map了
map,int>dist;
3. 某一狀態是否已經被訪問(搜尋)過:
這個同上,其實完全可以用上面的dist代替:假如沒被搜過,它對應的次數就是0啦
4.把map和tuple初始化為空,用.clear()函式就可以了
(tuple+map)ac**
#includeusing namespace std;
const int maxn=100+5;
const int maxm=0+5;
const int inf=0x3f3f3f3f;
int s,n,m;
queue>q;
map,int>dist;
tupletmp;
tuplehead;
bool daoman(int i,int j,int p)
bool daokong(int i,int j,int p)
void doit()
void bfs()
return 0;
}
(結構體+三維陣列)ac**
#includeusing namespace std;
const int maxn=100+5;
const int maxm=0+5;
const int inf=0x3f3f3f3f;
int s,n,m;
int x,y,z;
int dist[maxn][maxn][maxn];
struct node head,tmp;
queueq;
bool daoman(int i,int j,int p)
bool daokong(int i,int j,int p)
void doit(int xx,int yy,int zz)
void bfs()
return 0;
}
非常可樂bfs搜尋
大家一定覺的運動以後喝可樂是一件很愜意的事情,但是seeyou卻不這麼認為。因為每次當seeyou買了可樂以後,阿牛就要求和seeyou一起分享這一瓶可樂,而且一定要喝的和seeyou一樣多。但seeyou的手中只有兩個杯子,它們的容量分別是n 毫公升和m 毫公升 可樂的體積為s s 101 毫公升...
SDAU 搜尋專題 17 非常可樂
1 問題描述 problem description 大家一定覺的運動以後喝可樂是一件很愜意的事情,但是seeyou卻不這麼認為。因為每次當seeyou買了可樂以後,阿牛就要求和seeyou一起分享這一瓶可樂,而且一定要喝的和seeyou一樣多。但seeyou的手中只有兩個杯子,它們的容量分別是n ...
HDU 1495 非常可樂(搜尋)
題目鏈結 大家一定覺的運動以後喝可樂是一件很愜意的事情,但是seeyou卻不這麼認為。因為每次當seeyou買了可樂以後,阿牛就要求和seeyou一起分享這一瓶可樂,而且一定要喝的和seeyou一樣多。但seeyou的手中只有兩個杯子,它們的容量分別是n 毫公升和m 毫公升 可樂的體積為s s 10...