輸入格式:
第一行有乙個正整數t(t<=10),表示一共有n組資料。接下來有t個5×5的矩陣,0表示白色騎士,1表示黑色騎士,*表示空位。兩組資料之間沒有空行。
輸出格式:
對於每組資料都輸出一行。如果能在15步以內(包括15步)到達目標狀態,則輸出步數,否則輸出-1。
輸入樣例#1:
複製
2輸出樣例#1:10110
01*11
10111
01001
00000
01011
110*1
01110
01010
00100
複製
7【題解】啟發式搜尋
#include#includeusing namespace std;int dx= ,
dy= ;
int e[6][6]= ,,,,,};
int get(int st[6][6])
int ans;
int st[6][6];
inline int min(int a,int b)
for(int i=0; i<8; i++)
}char input[7];
int main()
dfs(0,sx,sy);
if(ans!=0x3f3f3f3f)printf("%d\n",ans);
else puts("-1");
} return 0;
}
SCOI2005 騎士精神
乙個比較直接的思路是bfs爆搜,但這樣只能拿20分,所以考慮優化。在測試樣例時能夠看到深度為7的時候很快就跑出來了,在結合本題最大深度是15,所以可以用雙向bfs來優化,即從兩邊各跑7或8的深度,最後用map合併,有點類似折半搜尋。另外有一些需要注意的小細節已經在 中注釋。code include ...
SCOI2005 騎士精神
qwq,ida 演算法太好玩了!在這裡放一波我對迭代加深搜尋 a 演算法的理解 不一定對 迭代加深搜尋就是列舉dfs的最大深度,然後跑dfs,去驗證不超過此深度的前提下是否有解 多用於答案上界很小或是搜尋範圍沒有上界,其實就是防止了dfs一搜到底。a 演算法看起來像是乙個剪枝,定義估價函式,樂觀地估...
SCOI2005 騎士精神 IDA
棋盤太大,狀態數太多,無法像八數碼那樣用雜湊 bfs去做,但是用dfs也會t掉,這個時候可以考慮ida 即 迭代加深搜尋 a 剪枝。這題的h n 就是當前與目標棋盤不同的棋子數量。在一顆含有答案的子樹中,我們至多需要再走h n 步,就可以找到答案 因此,當當前步數 h n 最大可走步數時,就可以剪枝...