bzoj 1085 騎士精神

2021-07-10 09:33:27 字數 1336 閱讀 9299

time limit: 10 sec  

memory limit: 162 mb

submit: 1461  

solved: 796 [

submit][

status][

discuss]

在乙個5×5的棋盤上有12個白色的騎士和12個黑色的騎士, 且有乙個空位。在任何時候乙個騎士都能按照騎士的走法(它可以走到和它橫座標相差為1,縱座標相差為2或者橫座標相差為2,縱座標相差為1的格仔)移動到空位上。 給定乙個初始的棋盤,怎樣才能經過移動變成如下目標棋盤: 為了體現出騎士精神,他們必須以最少的步數完成任務。

第一行有乙個正整數t(t<=10),表示一共有n組資料。接下來有t個5×5的矩陣,0表示白色騎士,1表示黑色騎士,*表示空位。兩組資料之間沒有空行。

對於每組資料都輸出一行。如果能在15步以內(包括15步)到達目標狀態,則輸出步數,否則輸出-1。

210110

01*11

10111

01001

00000

01011

110*1

01110

01010

001007-1

題解:這道題如果直接爆蒐會tle,所以這裡引入搜尋家族的乙個新成員a*,所謂a*就是啟發式搜尋,之所以稱為啟發式搜尋,是因為他不是漫無目的搜尋每乙個狀態,而是有目的性的進行搜尋。啟發式搜尋的核心就是估價函式,估價函式就是對於當前狀態預先估計乙個到達目標狀態的可能值。如果估價值偏小,那麼有可能效率低下,如果估計值偏大,有可能遺失正確的答案,所以函式的構建才是關鍵,需要具體情況具體分析。

就這道題來說,他的估價函式值就是當前狀態與目標狀態不同位置的數目,如果要使其達到目標狀態,至少需要這個數目的步數,如果這個步數都已經超過了限制的步數的話,那就沒有再搜的必要了,這樣就可以減少搜尋的次數。

#include#include#include#includeusing namespace std;

int ans[10][10]=,,,,};

int a[10][10];

int t,x,y,pd,k;

int xx[10]=;

int yy[10]=;

int eva(int s)

return 1;

}int judge()

void search(int s,int x,int y)

if (pd) return;

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

}int main()

for (k=1;k<=15;k++)

}if (!pd) printf("-1\n");} }

BZOJ 1085 騎士精神 A

description 在乙個5 5的棋盤上有12個白色的騎士和12個黑色的騎士,且有乙個空位。在任何時候乙個騎士都能按照騎士的走法 它可以走到和它橫座標相差為1,縱座標相差為2或者橫座標相差為2,縱座標相差為1的格仔 移動到空位上。給定乙個初始的棋盤,怎樣才能經過移動變成如下目標棋盤 為了體現出騎...

bzoj1085 騎士精神 A

在乙個5 5的棋盤上有12個白色的騎士和12個黑色的騎士,且有乙個空位。在任何時候乙個騎士都能按照騎士的走法 它可以走到和它橫座標相差為1,縱座標相差為2或者橫座標相差為2,縱座標相差為1的格仔 移動到空位上。給定乙個初始的棋盤,怎樣才能經過移動變成如下目標棋盤 為了體現出騎士精神,他們必須以最少的...

BZOJ 1085 騎士精神

time limit 10 sec memory limit 162 mb submit 3229 solved 1908 submit status discuss description 在乙個5 5的棋盤上有12個白色的騎士和12個黑色的騎士,且有乙個空位。在任何時候乙個騎士都能按照騎士的走法...