不說了,這玩意就是個人生題,昨天晚上各種鬼,還有變數突然變成0的坑爹事情都出現了。
十五步以上算-1解。。。
總體思路,ida*:
1.寫個估值函式,這裡我寫的是和目標圖的理想差異
2.列舉步數,根據步數和估值來決定剪枝。
3.一點經驗,估值剪枝不要嚴格卡在步數上,可以適當放高上限,確保答案在搜尋樹上,換言之就是剪枝寫的魯棒一點,確保答案完整性,再去考慮效率,當然,這一題的條件可以很顯然,g步最多接近最終局面g+1步,所以很容易寫出剪枝。
黏上醜陋不堪的**:
1 #include2 #include3 #include4 #include5就醬吧。6using
namespace
std;78
const
int ans[5][5] =
9 ,10 ,
11 ,
12 ,
13 ,
14};
15int map[5][5
];16
int flag = 0;17
int dx[9] = ;
18int dy[9] = ;
19int
gx()
2028
29void dfs(int x,int y,int s,int
k)30
34if(g + s > k+1) return
; //g步最多改變g+1個位置所以上限為k+1。
35for(int i = 0;i < 8;i++)
364445}
46int
main()
47else
if(a[j] >='
0'&&a[j] <= '9'
)68}69
}70for(int i = 1;i <= 15;i++)76}
77if(!flag) cout<
<
78}
79return0;
80 }
IDA 演算法 騎士精神
騎士精神 description 在乙個5 5的棋盤上有12個白色的騎士和12個黑色的騎士,且有乙個空位。在任何時候乙個騎士都能按照騎士的走法 它可以走到和它橫座標相差為1,縱座標相差為2或者橫座標相差為2,縱座標相差為1的格仔 移動到空位上。給定乙個初始的棋盤,怎樣才能經過移動變成如下目標棋盤 為...
IDA 演算法 騎士精神
騎士精神 description 在乙個5 5的棋盤上有12個白色的騎士和12個黑色的騎士,且有乙個空位。在任何時候乙個騎士都能按照騎士的走法 它可以走到和它橫座標相差為1,縱座標相差為2或者橫座標相差為2,縱座標相差為1的格仔 移動到空位上。給定乙個初始的棋盤,怎樣才能經過移動變成如下目標棋盤 為...
SCOI2005 騎士精神 IDA
棋盤太大,狀態數太多,無法像八數碼那樣用雜湊 bfs去做,但是用dfs也會t掉,這個時候可以考慮ida 即 迭代加深搜尋 a 剪枝。這題的h n 就是當前與目標棋盤不同的棋子數量。在一顆含有答案的子樹中,我們至多需要再走h n 步,就可以找到答案 因此,當當前步數 h n 最大可走步數時,就可以剪枝...