題意:給出兩個容積分別為 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。
//view codememory 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
)
樹的直徑(兩個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中的格...