SCOI2005 騎士精神 IDA

2021-08-09 04:09:15 字數 1100 閱讀 9536

棋盤太大,狀態數太多,無法像八數碼那樣用雜湊+bfs去做,但是用dfs也會t掉,這個時候可以考慮ida*,即 迭代加深搜尋 + a*剪枝。

這題的h(n)就是當前與目標棋盤不同的棋子數量。在一顆含有答案的子樹中,我們至多需要再走h(n)步,就可以找到答案

因此,當當前步數+h(n) > 最大可走步數時,就可以剪枝

於是現在要求最大可走步數,這裡就體現了迭代加深,每次加大最大可走步數(直到15步),在強制認為答案等於迭代數的思想下搜尋,如果搜尋到目標點時直接輸出迭代數,搜不到迭代數加1。這樣做的好處是,不需要再開乙個dis陣列記錄距離。

for(fd=0; fd<=15; fd++) 

}

並且迭代加深有時是比dfs快的,因為對於一些問題,從根出發的每一棵搜尋子樹都很深,或者說搜尋樹在某個方向上是無限的,舉個栗子,設存在子樹1,子樹2,每一棵子樹深度十分十分大,然後答案存在於子樹2的第1層,如果用dfs可能都會爆棧,但是用迭代加深幾次就搜到了。

#include 

#include

#include

#include

using

namespace

std;

#define debug(x) cerr<<#x<<"="int a[6][6];

int n, t, ans, fd, hd, x, y;

bool ***;

inline

int h()

inline

bool check()

int dx[8] = ;

int dy[8] = ;

void dfs(int x, int y, int d)

if(***) return;

for(int i=0; i<8; i++)

}}int main()

a[i][j] = temp[j] - '0';} }

for(fd=0; fd<=15; fd++)

}if(!***)

printf("-1\n");

}return

0;}

SCOI2005 騎士精神(IDA )

題面 scoi2005 騎士精神 對於這道題,我們第一眼 bfs 爆搜 第二眼 發現事情沒這麼簡單 這是道省選題 第三眼 仔細一想,直接 bfs 難道不會被卡爆嗎?第四眼 發現題目中有 如果能在15步以內 包括15步 到達目標狀態,則輸出步數,否則輸出 1 好的,ida 啟發式迭代加深 ida 是什...

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...