HDUOJ 1495 非常可樂(這個廣搜可還行)

2021-09-10 06:07:43 字數 1230 閱讀 3777

題意就不多說了,就是有三個杯子可以來回倒可樂,當其中兩個杯子的可樂的量是總的量的一半的時候,就到了題目要的那種狀態,這個問題可以使用廣搜來解決,不難發現,這個過程中,我們有六種操作,就是把某個杯子的可樂倒到另外的兩個杯子中,一共三個杯子,所以一共六種狀態,所以,我們的思路就是,從最初的狀態開始,一步一步的向下乙個狀態轉移,然後加入佇列,在下一步中取出這個狀態,以後的操作都是如此,直到我們需要的狀態出現,就結束bfs函式,每次轉移都記錄當前的運算元,最後只需要輸出最後一步的運算元即可。

ac**:

#include

#include

#include

#include

using namespace std;

int a, b, c, visit[105][105][105];

struct edge

;int bfs(void);

int main(void)

if(a % 2 != 0)

memset(visit, 0, sizeof(visit));

int flag = 1;

flag = bfs();

if(flag == -1)

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

}return 0;

} int bfs(void)

for(int i = 0; i < 6; i++)

else

if(visit[next.x][next.y][next.z] == 0)

}if(i == 1)//把第一瓶水到給第三瓶 

else

if(visit[next.x][next.y][next.z] == 0)

}if(i == 2)//把第二瓶水到給第一瓶 

else

if(visit[next.x][next.y][next.z] == 0)

}if(i == 3)//把第二瓶水到給第三瓶 

else

if(visit[next.x][next.y][next.z] == 0)

}if(i == 4)//把第三瓶水到給第一瓶 

else

if(visit[next.x][next.y][next.z] == 0)

}if(i == 5)//把第三瓶水到給第二瓶 

else

if(visit[next.x][next.y][next.z] == 0)}}

}return -1;

}

1495 非常可樂

看題目時萬萬沒想到是bfs 不過這種尋找最少次數的問題確實除了bfs也想不到其他辦法了orz problem description 大家一定覺的運動以後喝可樂是一件很愜意的事情,但是seeyou卻不這麼認為。因為每次當seeyou買了可樂以後,阿牛就要求和seeyou一起分享這一瓶可樂,而且一定要...

hdu 1495 非常可樂

題意 給你三個容器讓你平分可樂,求最少的步數。思路 一看到求最少步數,就想到了廣搜,但是沒有思路,但看別人分情況,瞬間就明白啦。可以s n,s m,n s,n m,m s,m n這六種情況討論就行,每種又有倒完和倒不完兩種情況,直到出現兩個容器都有s 2,這就是最少步數。但s是奇數時是不能平分的,三...

hdu 1495 非常可樂

hdu 1495 非常可樂 題目大意 給你三個容器,他們的容量分別是 s,n,m 且s n m,給你s,n,m。s代表裝在容器裡可樂,n和m代表的是兩個杯子的容量,求他們能否平分這杯可樂。如果能就輸出倒的最小次數,如果不能就輸出 no。題目分析 也就是要達到能 s 2,0,s 2或 0 s 2,s ...