BZOJ 1085 騎士精神 DFS A

2021-07-14 19:30:09 字數 1278 閱讀 999

在乙個5×5的棋盤上有12個白色的騎士和12個黑色的騎士, 且有乙個空位。在任何時候乙個騎士都能按照騎士的走法(它可以走到和它橫座標相差為1,縱座標相差為2或者橫座標相差為2,縱座標相差為1的格仔)移動到空位上。 

給定乙個初始的棋盤,怎樣才能經過移動變成如下目標棋盤: 為了體現出騎士精神,他們必須以最少的步數完成任務。

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

對每組資料都輸出一行。如果能在15不以內(包括15)到達目標狀態,則輸出步數,否則輸出「bored!」沒有引號。

開始用單向bfs做tle沒商量  本題可以用雙向bfs解決

a* 啟發式搜尋就是在狀態空間中的搜尋對每乙個搜尋的位置進行評估,得到最好的位置,再從這個位置進行搜尋直到目標。這樣可以省略大量無謂的搜尋路徑,提高了效率。在啟發式搜尋中,對位置的估價是十分重要的。採用了不同的估價可以有不同的效果。 

因為步數在15以內  所以我們可以遍歷標準圖與測試圖 如果兩個相差大於 15    則步數不夠

同理 當我們dfs完 第一次變化 步數減少1   遍歷標準圖與測試圖 如果兩個相差大於14 則步數不夠

但是 當需要15次變換可以得到標準圖時 暴力dfs就會超時

於是我們就一次一次dfs 搜尋

ac**:

#include #include #include#include#includei

using namespace std;

char maze[10][10];

int ans[6][6] = ;

int s,bx, by,kf;

int f[8][2] = ;

int find(int task[10][10],int k,int kf)

} return count;

}void dfs(int x, int y, int task[10][10], int k, int kf)

else

} }}

int main()

if (maze[i][j] == '1')

if (maze[i][j] == '0')

}} s = 16;

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

if (s == 16) printf("bored!\n");

else printf("%d\n", s) ;

} return 0;

}

bzoj 1085 騎士精神

time limit 10 sec memory limit 162 mb submit 1461 solved 796 submit status discuss 在乙個5 5的棋盤上有12個白色的騎士和12個黑色的騎士,且有乙個空位。在任何時候乙個騎士都能按照騎士的走法 它可以走到和它橫座標相差...

BZOJ 1085 騎士精神 A

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

bzoj1085 騎士精神 A

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