在乙個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的格仔 移動到空位上。給定乙個初始的棋盤,怎樣才能經過移動變成如下目標棋盤 為了體現出騎士精神,他們必須以最少的...