騎士精神 SCOI2005 BZOJ1085

2021-09-19 14:12:06 字數 946 閱讀 6736

傳送門這道題其實一點都不難,我不太明白為什麼lyd打了*。

首先馬字拓展狀態。

int dx[8]

=;int dy[8]

=;

貌似,暴力就這個沒了

但是這樣t

⁡\large \operatorname

t的沒邊!

於是往裡面塞個迭代加深

還是t

⁡\large \operatorname

t那個來個ida*

⁡\large \operatorname

ida*

此處設計:

由於我們要與目標狀態一致

於是我們要統計現在與目標的不同個數,因為我們至少需要這麼多步(此處即為估值函式)才能到達目標狀態

因為我們不知道那只馬會移動,那我們乾脆移動空格好了。

#include

#include

#include

#include

#include

using

namespace std;

char ed[6]

[6]=

,,,,

,};int dx[8]

=;int dy[8]

=;int dep,x,y;

char a[6]

[6];

intgj()

if(a[i]

[j]!=ed[i]

[j]&&ed[i]

[j]!=

'*')cnt++

;//*不算

}return cnt;

}bool

dfs(

int now)

return0;

}int

main()

return0;

}

SCOI2005 騎士精神

乙個比較直接的思路是bfs爆搜,但這樣只能拿20分,所以考慮優化。在測試樣例時能夠看到深度為7的時候很快就跑出來了,在結合本題最大深度是15,所以可以用雙向bfs來優化,即從兩邊各跑7或8的深度,最後用map合併,有點類似折半搜尋。另外有一些需要注意的小細節已經在 中注釋。code include ...

SCOI2005 騎士精神

輸入格式 第一行有乙個正整數t t 10 表示一共有n組資料。接下來有t個5 5的矩陣,0表示白色騎士,1表示黑色騎士,表示空位。兩組資料之間沒有空行。輸出格式 對於每組資料都輸出一行。如果能在15步以內 包括15步 到達目標狀態,則輸出步數,否則輸出 1。輸入樣例 1 複製2 10110 01 1...

SCOI2005 騎士精神

qwq,ida 演算法太好玩了!在這裡放一波我對迭代加深搜尋 a 演算法的理解 不一定對 迭代加深搜尋就是列舉dfs的最大深度,然後跑dfs,去驗證不超過此深度的前提下是否有解 多用於答案上界很小或是搜尋範圍沒有上界,其實就是防止了dfs一搜到底。a 演算法看起來像是乙個剪枝,定義估價函式,樂觀地估...