將棋子「馬」隨機的放在西洋棋棋盤board[8][8]的某個方格中,「馬」按走棋規則進行移動,要求每個方格只進入一次,走遍棋盤上所有的64個方格。
編寫非遞迴程式,求出「馬」的行走路線,並按求出的行走路線將數字1-64依次填入乙個8x8的方陣並輸出。
一看題目說是8x8棋盤,要求走遍棋盤,首先想到的便是直接深搜即可,但是後面說到要求非遞迴程式,這也簡單,自己把遞迴的那一部分
改為用棧來實現即可(馬走棋盤肯定會遇到走不下去的情況,所以需要儲存之前已經走過的點,而「悔棋」肯定是從當前這一步往之前返
回,所以是乙個後進先出的結構——棧)。
定義typedef
struct _horse
horse;
int chessboard[8]
[8];
//棋盤
int next[8]
[2]=
,,,,
,,,}
;//方向
int cnt =1;
//計數器
stack horse;
執行函式bool judge
(int a,
int b)
void
horse
(int x,
int y)}if
(i <8)
//能夠訪問當前馬位置附近的日點
else
//回溯
}}
完成後測試了一下,只有(0,0)可以跑出來,可見這種暴力的方式效率實在是太低…
上面的暴力試探方式效率實在太低了,所以我們要優化一下**。
把書繼續往後翻,有提到將馬的初始步入棧,計算其8個方向的權值,將其按公升序排列,馬從最小權值的點開始走,
無路可走時回溯(權值就是乙個點下一步能走的點的總數)。
這是一種貪心的思想,那麼既然是貪心,我們可不可以再貪心一些,每一步直接走權值最小的點,不再回溯,看能不能走完。
執行函式void
horse
(int x,
int y)}}
//直接走權值最小的點
chessboard[tx]
[ty]
=++cnt;
temp.s = ti;
= h_min;
horse.
push
(temp)
;memset
(&temp,0,
sizeof
(horse));
temp.x = tx;
temp.y = ty;
}}
這次測試了一下,效率大大的提高了,但是我們是「最」貪心的方法,所以我們要測試一下,看能不能從任意點出發都能走完棋盤。經過測試有乙個點不能走完棋盤,就是(2,4),也就是三行五列的點。
好吧,既然只有乙個點不能按照我們最貪心的方式走完,那麼我們就只對這乙個點特殊處理一下。
處理方式即就是分析2時所說的按權值大小排序,從最小的開始走。
#include
#include
#include
#include
using namespace std;
/* 馬踏棋盤 */
typedef
struct _horse
horse;
int chessboard[8]
[8];
//棋盤
int next[8]
[2]=
,,,,
,,,}
;//方向
int cnt =1;
//計數器
stack horse;
//判別
bool judge
(int a,
int b)
//從小到大排序
bool cmp
(horse& a, horse& b)
//計算權值
intsteps
(int a,
int b)
return sum;
}//執行過程
void
horse
(int x,
int y)}}
//直接走權值最小的點
chessboard[tx]
[ty]
=++cnt;
temp.s = ti;
= h_min;
horse.
push
(temp)
;memset
(&temp,0,
sizeof
(horse));
temp.x = tx;
temp.y = ty;}}
//特殊點執行過程(2,4)
void
horse_2
(int x,
int y)
}sort
(horse_2, horse_2 + k, cmp)
;//按權值從小到大排序
for(
int i =
0; i < k; i++
) horse_2[i]
.flag = i;
if(k >
0&& flag < k)
//有路可走
else
//回溯}}
//輸出
馬踏棋盤python 馬踏棋盤python實現
import collections import random class checkerboard object 初始化棋盤 def init self,len self.len len self.position has gone set def init checkerboard self ...
回溯演算法(馬踏棋盤)
近期學習了回溯演算法於是自己寫了馬踏棋盤的遞迴以及非遞迴方式的 theme 馬踏棋盤 回溯演算法 coder 秒針的聲音 time 2015.1.11 include include include define m 8 typedef struct nodehorse horse horse1 i...
馬踏棋盤演算法
為.c檔案 include include include define rows 8 define cols 8 int cheesboard rows cols const int movex 8 const int movey 8 初始化棋盤,將棋盤所有的位置賦值為0 void initboa...