time limit: 10 sec memory limit: 162 mb
submit: 2490 solved: 1422
[submit][status][discuss]
在乙個5×5的棋盤上有12個白色的騎士和12個黑色的騎士, 且有乙個空位。在任何時候乙個騎士都能按照騎
士的走法(它可以走到和它橫座標相差為1,縱座標相差為2或者橫座標相差為2,縱座標相差為1的格仔)移動到空
位上。 給定乙個初始的棋盤,怎樣才能經過移動變成如下目標棋盤: 為了體現出騎士精神,他們必須以最少的步
數完成任務。
第一行有乙個正整數t(t<=10),表示一共有t組資料。接下來有t個5×5的矩陣,0表示白色騎士,1表示黑色騎
士,*表示空位。兩組資料之間沒有空行。
對於每組資料都輸出一行。如果能在15步以內(包括15步)到達目標狀態,則輸出步數,否則輸出-1。
210110
01*11
10111
01001
00000
01011
110*1
01110
01010
001007-1
做迭代加深的第一題,調了好久qaq.
分析:這道題和八數碼問題很像,直接dfs的話是一條道走到底,可能會搜很多步也搜不出結果,直接bfs狀態擴充套件的較多,然而本題有步數限制,所以可以想到用ida*,具體而言就是設定乙個走的步數的上限,如果走到了這個上限,還沒有搜到結果就返回,所有狀態搜尋完了就上限+1,為了提高效率,需要加乙個估價函式,也就是估計最壞情況下還要走多少步才能到達目標狀態,如果當前步數+當前最壞情況下的步數》上限,就不搜了,這個最壞情況下的步數=當前狀態與目標狀態每一位不同的個數,這麼估價可能過於樂觀,但是估價函式一定要估到最樂觀,不然可能會將正解漏掉。
#include #include#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
int t,a[10][10],x,y,endd[10][10
];bool
flag;
char
c;int dx = ;
int dy = ;
void
init()
bool
check()
intgujia()
void dfs(int step,int maxn,int xx,int
yy)
if(flag)
return
;
for (int i = 0; i < 8; i++)
}return;}
intmain()
}if(check())
for (int i = 1; i <= 15; i++)
}if (!flag)
printf(
"-1\n");
}return0;
}
BZOJ 1085 SCOI 2005 騎士精神
之前聽說過ida 好像很優越啊。估價函式為不在目標位置的棋子個數。列舉一遍最大搜尋深度即可。還得好好斟酌一下要列舉的搜尋深度。344ms。include include using namespace std define rep i,j,k for int i j imaxdep return 0...
bzoj1085 SCOI2005 騎士精神
此題用到了a 演算法以及迭代加深搜尋。其實做本題之前看到過這個東西,發現估價什麼的好複雜,一直不會用。但應用於本題很容易就能實現,只要和最終結果一一比對即可。演算法如下,借鑑了hzwer大神的寫法。include include using namespace std int ans 5 5 int...
BZOJ1085 SCOI2005 騎士精神
在乙個5 5的棋盤上有12個白色的騎士和12個黑色的騎士,且有乙個空位。在任何時候乙個騎士都能按照騎 士的走法 它可以走到和它橫座標相差為1,縱座標相差為2或者橫座標相差為2,縱座標相差為1的格仔 移動到空 位上。給定乙個初始的棋盤,怎樣才能經過移動變成如下目標棋盤 為了體現出騎士精神,他們必須以最...