UVa12569樹上的機械人的規劃

2022-05-19 19:08:28 字數 2500 閱讀 9755

今天更新一篇,直奔主題。

題意:有一棵n(4<=n<=15)個結點的樹,其中乙個結點有乙個機械人,還有一些結點有石頭。每步可以把乙個機械人或石頭移到乙個相鄰的節點。任何情況下乙個結點裡不能有兩個東西(石頭或機械人)。輸入每個石頭的位置和機械人的起點和終點,求最小步數的方案。如果有多解,可以輸出任意解。

建議看原題。

思路:由於(4<=n<=15)以及求最小步數的方案,所以我們可以採用bfs的方法去做,對於路徑尋找問題,自然需要對不同的狀態進行記錄,根據n很小我們可以採用狀態壓縮(二進位制)進行表示。

我們採用stl的set或者hash進行查詢重複,但是set太慢了,也許之前做的題對時間要求不高,於是使用了set發現超時,試了試hash發現快了很多2000ms左右

下面是**:

set超時**

//

uva 12569

//bfs+狀態壓縮+剪枝

#include #include

#include

#include

using

namespace

std;

typedef

long

long

ll;

struct

node

};int n, m, s, t, g[20][20

]; int

kase;

intl, r;

vector

v;set

int> >set;

void move(node& u1, int i, int j, int

root)

bool try_to_insert(node& u, int i, int

j)

return

false; }

void print(int

cur)

}void bfs(node&start)

for (int i = 1; i <= n; ++i)

if (u.tree&(1

if (g[i][j] && (u.tree&(1

<0 &&try_to_insert(u, i, j))

} printf(

"case %d: -1\n\n

", ++kase);

}int

main()

memset(g,

0, sizeof

(g));

for (int i = 0; i < n-1; ++i)

bfs(start);

} return0;

}

hash快速**

//

uva 12569

//bfs+狀態壓縮+剪枝(不用set用hash)

#include #include

#include

using

namespace

std;

struct

node

};int n, m, s, t, g[20][20

]; int

kase;

intl, r;

vector

v;void move(node& u1, int i, int j, int

root)

const

int hashsize = 131072; //

2 ^ 16

int head[hashsize+10], next[100003]; //

just try

void init_lookup_table()

int try_to_insert(node& u, int i, int j, int

pos)

next[pos] =head[tree];

head[tree] =pos;

return1;

}void print(int

cur)

}void bfs(node&start)

for (int i = 1; i <= n; ++i)

if (u.tree&(1

if (g[i][j] && (u.tree&(1

<0 &&try_to_insert(u, i, j, r))

} printf(

"case %d: -1\n\n

", ++kase);

}int

main()

memset(g,

0, sizeof

(g));

for (int i = 0; i < n-1; ++i)

bfs(start);

} return0;

}

就這樣,不懂的地方問我,我會及時回覆的。

UVA 12569樹上的機械人規劃

首先想到的是 graph 儲存 無向圖 flag 表示按序號排列的石頭的個數 note 表示所有點按順序是否被佔據 使用bfs 將flag換算成16進製制 hash 判重 note 換成二進位制儲存在struct state 迴圈中按序遍歷 flag 陣列 由note判斷能否行走 這樣很複雜 網上的...

好色機械人的豔遇 機械人豔遇 《機械人的旅行》

講述機械人 路遇開房車的 剛剛開始的時候畫風很舒服,直到到了晚上上了她的床之後。畫風速變了!這個女主角聲音超好聽。整個情節實在太流氓了,太猥瑣了!連六六君這樣的老司機都看不下去了!正片在三分五十,不謝 很抱歉,此內容已經失效了!就連六六君也無法恢復了。請欣賞其他有效的內容 當您看到這條資訊的時候,很...

巡邏機械人 UVa 1600

機械人要從乙個m n 1 m,n 20 網格的左上角 1,1 走到右下角 m,n 網格中的一些格仔是空地 用0表示 其他格仔是障礙 用1表示 機械人每次可以往4個方向走一格,但不能連續地穿越k 0 k 20 個障礙,求最短路長度。起點和終點保證是空地。例如,對於圖6 22 a 中的資料,圖6 22 ...