亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 騎士遍歷2.c

?? 具有多種經(jīng)典的數(shù)據(jù)結(jié)構(gòu)算法的程序集合
?? C
?? 第 1 頁 / 共 2 頁
字號:
求解騎士游歷問題 
顯然求解騎士游歷問題的每一步就是馬在棋盤上走的一步。在每一步馬需要選擇一個方向進行游歷,這時記住解的每一步需要記住兩件事: 
1.當前步的行列位置 
2.當前步已經(jīng)試探過哪些方向了,以便回溯回來時能夠選擇一個新的方向進行試探 
所以使用兩個數(shù)組,數(shù)組board記住棋盤的每個位置是在馬的第幾步到達的,這反映了問題的解,即第幾步到哪個位置。數(shù)組direction記住在棋盤的某個位置已經(jīng)試探過的方向,每個位置有八個方向,可按某種順序?qū)Π藗€方向編號,然后在每個位置按編號順序試探方向。 
在確定數(shù)據(jù)結(jié)構(gòu)之后,同樣需要確定下面幾個問題: 
1.怎樣的狀態(tài)是初始狀態(tài)。 
2.怎樣選擇當前步可能的路線 
3.怎樣表示向前推進一步 
4.怎樣回溯及清除當前步的痕跡 
顯然初始狀態(tài)是棋盤的每個位置都置為第0步到達(即還沒有到達),每個位置都還沒有選擇任何方向(可賦值MAX_DIR(=8)表示沒有選擇方向)。 
選擇當前步可能的路線就是在當前位置選擇一個方向來游歷下一步。在選擇的時候同樣需要區(qū)分是從第0個方向開始考慮還是從上一次的下一個方向開始考慮。為了方便從下一個方向開始考慮,實際上數(shù)組direction在某一位置(curr_x, curr_y)的值記住的是從上一位置選擇了哪個編號的方向而到達的,這樣容易回溯到上一位置,而且容易在回溯到上一位置之后從下個一方向重新試探。 
向前推進一步則要根據(jù)所選擇的方向推進到下一位置,記住到下一位置所選擇的方向,下一位置是第幾步到達的,然后增加步數(shù)。 
回溯一步則要標記當前位置沒有到達過(將到達的步數(shù)置為0),根據(jù)上一步到當前位置的所選擇的方向(這個方向是記錄當前位置所對應的direction數(shù)組中)而回溯到上一位置,然后減少步數(shù)。 
下面程序用類KNIGHT來封裝數(shù)組board、direction、當前位置(curr_x, curr_y)、當前步數(shù)(step),并且使用last_direction來記住上一位置到當前位置所選擇的方向。為了方便計算選擇一個方向后從當前推進到下一位置,使用數(shù)組var_x和var_y來記住每個方向在x方向和y方向的改變值。這個類中提供的方法的含義與類QUEEN類似。為節(jié)省篇幅起見,我們將類的界面、實現(xiàn)及演示放在了同一文件。

///////////////////////////////////////////////////////////////////////
程序二:求解騎士游歷問題的程序 

// 文件:KNIGHT.CPP 
// 功能:使用回溯算法求解騎士游歷問題
#include <iostream.h> 
#include <iomanip.h> 
enum BOOLEAN { 
TRUE = 1, 
FALSE = 0 
}; 
const int MAX_WIDTH = 30; 
const int MAX_DIR = 8; 
class KNIGHT { 
public: 
// FUNCTION: 設置初始狀態(tài) 
KNIGHT(int width); 
// FUNCTION: 用比較直觀的方式打印問題的解 
// REQUIRE: 必須先調(diào)用了成員函數(shù)tourist() 
void print(); 
// FUCTION: 根據(jù)馬的起始位置(start_x, start_y)使用回溯算法求騎士游歷問題的一個解 
// REQUIRE: (start_x, start_y)必需在所設置的棋盤寬度范圍內(nèi) 
BOOLEAN tourist(int start_x, int start_y); 
protected: 
// FUNCTION: 初始化記錄所選方向的數(shù)組,將每個值置為MAX_DIR 
void init_direction(); 
// FUNCTION: 初始化記錄馬在第幾步到位每個位置的數(shù)組,將每個值置為0 
void init_chessboard(); 
// FUNCTION: 設置初始狀態(tài),包括初始化方向數(shù)組和棋盤數(shù)組,并設置馬的初始位置 
void set_start(int x, int y); 
// FUNCTION: 在當前位置選擇一個方向以推進到下一位置 
// RETURN: 如果可選擇一個方向推進則返回TRUE,否則返回FALSE 
// NOTE: 將該函數(shù)定義為虛函數(shù),以便下面快速游歷的類來重定義該函數(shù)而產(chǎn)生動態(tài)綁定 
virtual BOOLEAN select_direction(); 
// FUNCTION: 從當前位置回溯到上一位置 
// NOTE: 將該函數(shù)定義為虛函數(shù),以便下面快速游歷的類來重定義該函數(shù)而產(chǎn)生動態(tài)綁定 
virtual void backward(); 
// FUNCTION: 從當前位置推進到下一位置 
// NOTE: 將該函數(shù)定義為虛函數(shù),以便下面快速游歷的類來重定義該函數(shù)而產(chǎn)生動態(tài)綁定 
virtual void forward(); 
// FUNCTION: 判斷馬是否能夠走向位置(x, y)。 
// RETURN: 如果馬已經(jīng)到過該位置,或該位置超出棋盤范圍返回FALSE,否則返回TRUE 
BOOLEAN is_legal(int x, int y); 
// FUNCTION: 判斷是否回溯到初始狀態(tài) 
// RETURN: 如果步數(shù)回到第1步則表示回到初始狀態(tài)而返回TRUE,否則返回FALSE 
BOOLEAN back_to_start(); 
// FUNCTION: 判斷是否游歷完所有位置 
// RETURN: 如果步數(shù)等于棋盤格子數(shù)則表示游歷完所有位置而返回TRUE,否則返回FALSE 
BOOLEAN is_end(); 
// 下面兩個數(shù)組用來記住選擇某個方向后,推進到下一位置時x方向和y方向的值的變化 
int var_x[MAX_DIR]; 
int var_y[MAX_DIR]; 
// 記錄馬第幾步到達某個位置的棋盤數(shù)組 
int chessboard[MAX_WIDTH][MAX_WIDTH]; 
// 記錄馬在某個位置是在上一位置選擇第幾個方向到達的 
int direction[MAX_WIDTH][MAX_WIDTH]; 
int width; // 棋盤寬度 
int curr_x, curr_y; // 馬的當前位置 
int step; // 已經(jīng)游歷的步數(shù) 
int last_direct
ion; // 上一位置到當前位置所選的方向 
}; 
KNIGHT::KNIGHT(int width) 
{ 
this->width = width; 
init_direction(); 
total_step = 0; 
} 
void KNIGHT::print() 
{ 
int x, y; 
cout << " +"; 
for (x = 0; x < width; x = x + 1) cout << "----+"; 
cout << '\n'; 
for (x = 0; x < width; x = x + 1) { 
cout << " |"; 
for (y = 0; y < width; y = y + 1) cout << setw(3) << chessboard[x][y] << " |"; 
cout << '\n'; 
cout << " +"; 
for (y = 0; y < width; y = y + 1) cout << "----+"; 
cout << '\n'; 
} 
} 
BOOLEAN KNIGHT::is_legal(int x, int y) 
{ 
if (x < 0 || x >= width) return FALSE; 
if (y < 0 || y >= width) return FALSE; 
if (chessboard[x][y] > 0) return FALSE; 
return TRUE; 
} 
BOOLEAN KNIGHT::back_to_start() 
{ 
if (step == 1) return TRUE; 
else return FALSE; 
} 
BOOLEAN KNIGHT::is_end() 
{ 
if (step > width * width) return TRUE; 
else return FALSE; 
} 
void KNIGHT::set_start(int x, int y) 
{ 
curr_x = x; curr_y = y; step = 1; 
chessboard[x][y] = step; step = step + 1; 
direction[x][y] = MAX_DIR; 
last_direction = MAX_DIR; 
} 
BOOLEAN KNIGHT::select_direction() 
{ 
int try_x, try_y; 
// last_direction為MAX_DIR表示當前位置是一個新的位置,在新推進到某個位置(curr_x, curr_y)時, 
// direction[curr_x][curr_y]會記錄上一位置到(curr_x, curr_y)時所選擇的方向,這時 
// last_direction置為MAX_DIR用來標記該位置是新推進的位置。 
if (last_direction == MAX_DIR) last_direction = 0; 
else last_direction = last_direction + 1; 
while (last_direction < MAX_DIR) { 
// 看下一步推進到哪個位置是合法的,如果合法則選擇該方向。 
try_x = curr_x + var_x[last_direction]; 
try_y = curr_y + var_y[last_direction]; 
if (is_legal(try_x, try_y)) break; 
last_direction = last_direction + 1; 
} 
if (last_direction == MAX_DIR) return FALSE; 
else return TRUE; 
} 
void KNIGHT::backward() 
{ 
step = step - 1; 
chessboard[curr_x][curr_y] = 0; 
// 將last_direction置為上一位置到(curr_x, curr_y)所選擇的方向 
last_direction = direction[curr_x][curr_y]; 
// 根據(jù)這個方向回溯到上一位置,同時回溯到上一位置之后,在上一位置再試探時應該從 
// last_direction+1的方向開始。參看成員函數(shù)select_direction()。 
curr_x = curr_x - var_x[last_direction]; 
curr_y = curr_y - var_y[last_direction]; 
} 
void KNIGHT::forward() 
{ 
// 在推進時last_direction是當前位置所選擇的方向 
curr_x = curr_x + var_x[last_direction]; 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91丨porny丨在线| 久久久久久久电影| 国产亚洲欧美激情| 亚洲在线中文字幕| 国产精品1区2区| 精品视频在线免费观看| 国产清纯白嫩初高生在线观看91 | 97se亚洲国产综合自在线观| 日韩欧美一区二区不卡| 一区二区三区小说| 成人激情综合网站| 久久影音资源网| 日本欧美加勒比视频| 欧美午夜视频网站| 夜夜嗨av一区二区三区中文字幕| 国产精品亚洲午夜一区二区三区| 91精品国产一区二区| 最新日韩在线视频| 国产激情视频一区二区在线观看| 日韩欧美激情一区| 日韩精品1区2区3区| 欧美三级三级三级爽爽爽| 亚洲欧美日韩久久精品| 99久久婷婷国产综合精品电影 | 国产一区二区福利| 欧美电影免费观看高清完整版在线观看| 亚洲一区二区三区视频在线播放 | 综合自拍亚洲综合图不卡区| 国产大片一区二区| 久久综合中文字幕| 国产麻豆91精品| 国产无人区一区二区三区| 韩国成人在线视频| 久久蜜桃av一区二区天堂| 国产麻豆欧美日韩一区| 久久嫩草精品久久久精品一| 国产乱人伦偷精品视频免下载 | 久久福利资源站| 久久亚洲二区三区| 不卡电影一区二区三区| 中文字幕制服丝袜一区二区三区 | 91麻豆精品国产91久久久更新时间 | 亚洲素人一区二区| 91蜜桃免费观看视频| 亚洲综合免费观看高清完整版在线 | 一区二区免费在线| 欧美高清视频在线高清观看mv色露露十八| 亚洲国产一区二区三区青草影视| 91福利视频网站| 石原莉奈在线亚洲三区| 欧美刺激午夜性久久久久久久| 久久精品国产久精国产| 久久色在线观看| 99久久精品一区二区| 亚洲成a人片在线不卡一二三区| 717成人午夜免费福利电影| 日本成人在线视频网站| 2024国产精品| 91污片在线观看| 午夜日韩在线电影| 久久一夜天堂av一区二区三区| 菠萝蜜视频在线观看一区| 亚洲欧美aⅴ...| 91精品国产高清一区二区三区蜜臀 | 久久精品视频一区二区三区| 波多野结衣欧美| 午夜欧美2019年伦理| 久久久蜜臀国产一区二区| 色婷婷av一区二区三区大白胸| 日韩精品一区第一页| 亚洲国产经典视频| 欧美日韩二区三区| 成人免费视频视频| 奇米精品一区二区三区在线观看一| 国产视频在线观看一区二区三区 | 国产精品911| 亚洲成人激情自拍| 国产日韩精品一区二区浪潮av | 亚洲超丰满肉感bbw| 国产亚洲美州欧州综合国| 欧美情侣在线播放| 色综合天天综合色综合av | www久久久久| 欧美日韩二区三区| 91免费看视频| 国产一区在线观看麻豆| 亚洲国产精品久久久男人的天堂 | 丰满少妇在线播放bd日韩电影| 天堂久久一区二区三区| 国产精品国产自产拍高清av | 国产精品美女久久久久久2018| 在线播放91灌醉迷j高跟美女 | 欧美美女一区二区三区| 成人av网站在线| 久久99蜜桃精品| 午夜欧美大尺度福利影院在线看| 国产精品国产三级国产普通话三级| 日韩亚洲欧美一区二区三区| 日本高清不卡在线观看| 成av人片一区二区| 国产麻豆成人传媒免费观看| 日本三级亚洲精品| 亚洲成av人影院在线观看网| 亚洲精品videosex极品| 亚洲欧美在线观看| 中文字幕在线一区| 国产精品久久久久久久久快鸭| 欧美成人乱码一区二区三区| 91精品国产91久久综合桃花| 欧美日韩美少妇| 欧美日韩国产美女| 欧美肥妇bbw| 欧美乱妇23p| 91精品国产综合久久精品app| 在线观看www91| 在线观看一区日韩| 91高清在线观看| 91超碰这里只有精品国产| 欧美色倩网站大全免费| 欧美午夜精品理论片a级按摩| 91啪亚洲精品| 欧美午夜电影在线播放| 欧美日韩另类国产亚洲欧美一级| 欧美日韩亚洲国产综合| 欧美伦理影视网| 精品少妇一区二区三区| 久久久亚洲综合| 国产精品成人一区二区三区夜夜夜 | 天堂蜜桃一区二区三区 | 91精品国产综合久久久蜜臀图片 | 麻豆免费精品视频| 另类中文字幕网| 国产成人免费视频网站高清观看视频| 久久99精品久久久久久久久久久久| 精品亚洲国产成人av制服丝袜 | 欧美最猛黑人xxxxx猛交| 欧美日韩一区二区电影| 欧美一区二区三区在线电影| 精品国产乱码久久| 国产精品乱码久久久久久| 亚洲码国产岛国毛片在线| 亚洲va天堂va国产va久| 韩国中文字幕2020精品| 91亚洲国产成人精品一区二区三| 欧美日韩一区二区三区在线| 精品国产免费人成在线观看| 国产精品久久三| 爽爽淫人综合网网站 | 日韩高清在线观看| 国产精品夜夜嗨| 欧美性大战xxxxx久久久| 久久先锋资源网| 亚洲一区免费在线观看| 国产精品自在在线| 欧美性猛交xxxx乱大交退制版| 欧美一级黄色大片| 日韩毛片视频在线看| 奇米在线7777在线精品| 99精品久久免费看蜜臀剧情介绍| 欧美日韩精品系列| 亚洲欧洲美洲综合色网| 免费看欧美美女黄的网站| 北岛玲一区二区三区四区| 3atv一区二区三区| 亚洲男人的天堂av| 国产一级精品在线| 欧美群妇大交群的观看方式| 国产精品天天看| 毛片av一区二区| 欧美日韩精品电影| 一区二区三区四区高清精品免费观看 | 国产一区在线观看麻豆| 欧美日韩国产首页在线观看| 中文字幕欧美国产| 久久99国产精品免费| 精品视频一区二区不卡| 国产精品不卡在线| 国产成人在线观看免费网站| 91精品久久久久久蜜臀| 亚洲国产视频在线| 99综合电影在线视频| 久久日一线二线三线suv| 亚洲va天堂va国产va久| 91久久国产综合久久| 国产精品蜜臀在线观看| 国产成人在线免费观看| 精品国产91九色蝌蚪| 蜜臀久久99精品久久久久宅男| 在线观看欧美黄色| 悠悠色在线精品| hitomi一区二区三区精品| 国产清纯美女被跳蛋高潮一区二区久久w| 免费日本视频一区| 欧美日免费三级在线| 亚洲资源中文字幕| 欧美日韩一级视频| 三级在线观看一区二区| 欧美一区二区三区公司| 日韩不卡一区二区| 欧美tickling网站挠脚心|