今天更新一篇,直奔主題。
題意:有一棵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 ...