骑士周游算法 c语言_C语言经典算法04--骑士走棋盘(骑士旅游:Knight tour)
說明:騎士旅游(Knight tour)在十八世紀初倍受數學家與拼圖迷的注意,它什么時候被提出已不可考,騎士的走法為西洋棋的走法,騎士可以由任一個位置出發,它要如何走完[所有的位置?
解法:騎士的走法,基本上可以使用遞回來解決,但是純綷的遞回在維度大時相當沒有效率,一個聰明的解法由J.C. Warnsdorff在1823年提出,簡單的說,先將最難的位置走完,接下來的路就寬廣了,騎士所要走的下一步,「為下一步再選擇時,所能走的步數最少的一步?!?#xff0c;使用這個方法,在不使用遞回的情況下,可以有較高的機率找出走法(找不到走法的機會也是有的)。
在一個n m 格子的棋盤上,有一只國際象棋的騎士在棋盤的左下角,騎士只能根據象棋的規則進行移動,要么橫向跳動一格縱向跳動兩格,要么縱向跳動一格橫向跳動兩格。 例如, n=4,m=3 時,若騎士在格子(2;1) ,則騎士只能移入下面格子:(1;3),(3;3) 或 (4;2);對于給定正整數n,m,I,j值 (m,n<=50,I<=n,j<=m) ,你要測算出從初始位置(1;1) 到格子(i;j)最少需要多少次移動。如果不可能到達目標位置,則輸出"NEVAR"。
騎士旅游的偽碼:
FOR(m = 2; m <= 總步數; m++)
[
測試下一步可以走的八個方向,記錄可停留的格數count。
IF(count == 0)
[
游歷失敗
]
ELSE IF(count == 1)
[
下一步只有一個可能
]
ELSE
[
找出下一步的出路最少的格子
如果出路值相同,則選第一個遇到的出路。
]
走最少出路的格子,記錄騎士的新位置。
]
#include int board[8][8] = {0};int main(void) {int startx, starty;int i, j;printf("輸入起始點:");scanf("%d %d總結
以上是生活随笔為你收集整理的骑士周游算法 c语言_C语言经典算法04--骑士走棋盘(骑士旅游:Knight tour)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php在线客服系统源码_在线客服系统物流
- 下一篇: oracle创建dblink语句_一文看