解題報告 非常可樂(廣度優先搜尋入門題)

2022-09-18 21:54:18 字數 1670 閱讀 7492

題意:給你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...