騎士精神 IDA

2022-08-19 22:51:17 字數 1100 閱讀 2453

不說了,這玩意就是個人生題,昨天晚上各種鬼,還有變數突然變成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 最大可走步數時,就可以剪枝...