BFS 兩個水杯轉換水量

2021-07-04 19:55:27 字數 2269 閱讀 7401

題意:給出兩個容積分別為 a 和 b 的pot,按照以下三種操作方式,求出能否在一定步數後,使者兩個pot的其中乙個的水量為c。

1.fill(i):將ipot倒滿水。

2.drop(i):將ipot倒空水。

3.pour(i,j): 將ipot的水倒到jpot上,直至要麼ipot為空,要麼jpot為滿。

思路:bfs求最短路徑,與1426類似,只是每個節點的子節點數為6個而已。具體參照1426。

//

memory time

//232k 32ms

#include

#include

#include

#include

using

namespace

std;

int v1,v2; //

兩個瓶子的容量

int c; //

目標殘餘水量

int k1,k2; //

在某狀態時兩個瓶子的剩餘水量,temporary

typedef

class

process;

//把整數a、b集成為 "a,b" 的字串形式(不包括引號),用於標記狀態

string combab(int a,int

b)void fill(int

i)

case

2: }

}void drop(int

i)

case

2: }

}void pour(int i,int

j)

else

return

; }

case

2: //

v2 to v1

else

return

; }

}}void bfs(void

); //

當前步的操作: 1z0:清空z瓶子 2z0:裝滿z瓶子 3xy:從x瓶倒向y瓶

mapvist;

vist[

"0,0

"]=true

; process queue[

1000]; //

狀態佇列

inthead,tail;

queue[head=0].x=0

; queue[tail=0].y=0

; queue[tail++].step=0

;

string ts; //

temporary

while(head

for(int i=1;i<=p.step;i++)

case2:

case3:}}

delete steps;

return

; }

/*裝滿v1

*/k1=p.x;

k2=p.y;

fill(1);

ts=combab(k1,k2);

if(!vist[ts])

/*裝滿v2

*/k1=p.x;

k2=p.y;

fill(2);

ts=combab(k1,k2);

if(!vist[ts])

/*清空v1

*/k1=p.x;

k2=p.y;

drop(1);

ts=combab(k1,k2);

if(!vist[ts])

/*清空v2

*/k1=p.x;

k2=p.y;

drop(2);

ts=combab(k1,k2);

if(!vist[ts])

/*v1倒向v2

*/k1=p.x;

k2=p.y;

pour(

1,2);

ts=combab(k1,k2);

if(!vist[ts])

/*v2倒向v1

*/k1=p.x;

k2=p.y;

pour(

2,1);

ts=combab(k1,k2);

if(!vist[ts])

head++;

}cout

<

impossible

"<

return;}

int main(void

)

view code

樹的直徑(兩個bfs)

樹的直徑 樹中的最長鏈 具體思路 隨便找乙個點bfs,然後找到最長的鏈,然後再以找到的點作為起點進行bfs,然後找到的最長的鏈就是樹的直徑。ac include include include include include include include include include inclu...

樹的直徑(兩個bfs)

樹的直徑 樹中的最長鏈 具體思路 隨便找乙個點bfs,然後找到最長的鏈,然後再以找到的點作為起點進行bfs,然後找到的最長的鏈就是樹的直徑。ac include include include include include include include include include inclu...

兩個座標系間的轉換

已知一系列點在a座標系下的座標和b座標系下對應的座標,求兩個座標系之間的轉換關係。把rt作為未知數表示出來 取n個對應點,聯立方程得ax b x a b matlab 如下 function x readx path readxworld 此處顯示有關此函式的摘要 此處顯示詳細說明 讀入txt中的格...