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

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

?? 騎士遍歷2.c

?? 源代碼非常少
?? C
?? 第 1 頁 / 共 2 頁
字號:
curr_y = curr_y + var_y[last_direction]; 
chessboard[curr_x][curr_y] = step; 
step = step + 1; 
// 這個方向被記錄下一位置(這時已經為(curr_x, curr_y))的direction數組中。 
direction[curr_x][curr_y] = last_direction; 
// last_direction的值已經被記錄,這時置為MAX_DIR表示當前位置為新推進的位置 
last_direction = MAX_DIR; 
} 
BOOLEAN KNIGHT::tourist(int start_x, int start_y) 
{ 
init_chessboard(); 
set_start(start_x, start_y); 
do { 
if (select_direction()) forward(); 
else backward(); 
} while (!back_to_start() && !is_end()); 
if (back_to_start()) return FALSE; 
else return TRUE; 
} 
void KNIGHT::init_direction() 
{ 
var_x[0] = 2; var_y[0] = 1; 
var_x[1] = 1; var_y[1] = 2; 
var_x[2] = -1; var_y[2] = 2; 
var_x[3] = -2; var_y[3] = 1; 
var_x[4] = -2; var_y[4] = -1; 
var_x[5] = -1; var_y[5] = -2; 
var_x[6] = 1; var_y[6] = -2; 
var_x[7] = 2; var_y[7] = -1; 
} 
void KNIGHT::init_chessboard() 
{ 
int x, y, dir; 
for (x = 0; x < width; x = x + 1) { 
for (y = 0; y < width; y = y + 1) { 
chessboard[x][y] = 0; 
} 
} 
} 
int main() 
{ 
int width = 8; 
KNIGHT knight(width); 
int start_x, start_y; 
cout << "\nProgram begin...\n"; 
start_x = 4; start_y = 4; 
if (knight.tourist(start_x, start_y)) { 
knight.print(); 
}else { 
cout << "\nHave not found the solution for: "; 
cout << "Start: <" << start_x << ", " << start_y << ">, "; 
cout << "Width: " << width << "\n"; 
} 
return 1; 
} 

l 騎士游歷問題的快速解
上面求解騎士游歷問題的程序效率比較低,對于8×8的棋盤將花費相當長一段時間。為此我們可以在選擇當前步的可能路線時增加一些啟發式規則,使得這個選擇從某種意義下來說是比較好的,從而加速問題的求解過程。 
對于騎士游歷問題一個啟發式規則是,在選擇當前步的方向時去選擇滿足下面條件的方向,當按這個方向推進到下一位置時,這個位置所可以再選擇的方向最少。也就是說在當前位置優先選一個走起來比?quot;艱難"的方向來推進。加入這種啟發式規則之后,從運行的效果看,在求解的過程中幾乎不回溯。 
為了使用這個啟發式規則,我們首先要修改上面的成員函數select_direction()。這時在每個位置選擇方向時不再是按照一定的順序來選擇,為了避免在回溯時重復選擇方向,必需記住在某個位置哪些方向已經選擇過了,我們使用三維數組cannot來記住這件事情,當其值為TRUE時表示某個位置的某個方向已經試探過了,為FALSE表示沒有試探過。當從當前位置回溯到上一位置是,要先把當前位置所有方向的cannot值置為FALSE,因為下一次再到達這個位置時所有方向需要重新試探。 
為了研究加入啟發式規則的效果,要求保留上面不使用啟發式規則的程序,這樣我們從KNIGHT類派生出一個類FAST_KNIGHT來支持快速求解騎士游歷問題。在這個類中增加數組cannot,并且只需要重新定義select_direction(), backward()和forward()就可以了。需要重新定義backward()和forward()是因為在這兩個成員函數中需要維護數組cannot的值。其它成員函數不用作任何的修改。我們在KNIGHT類中已經將這幾個成員函數定義為虛函數,以便在成員函數tourist()中動態地選擇這些函數來調用。讀者需要學習完第八章多態性之后才能充分理解動態綁定的含義。 
在下面程序中,我們只給出類FAST_KNIGHT的定義,讀者很容易修改演示程序以使用類FAST_KNIGHT來求解騎士游歷問題。 

程序三:快速求解騎士游歷問題的程序 

// 文件:FASTKNIGHT.CPP 
// 功能:使用回溯算法快速求解騎士游歷問題 
class FAST_KNIGHT: public KNIGHT { 
public: 
FAST_KNIGHT(int width); 
protected: 
// FUNCTION: 初始化cannot數組 
void init_cannot(); 
// FUNCTION: 在當前位置根據啟發式規則選擇一個方向以推進到下一位置 
// RETURN: 如果可選擇一個方向推進則返回TRUE,否則返回FALSE 
// NOTE: 重定義KNIGHT類的select_direction() 
virtual BOOLEAN select_direction(); 
// FUNCTION: 從當前位置回溯到上一位置,注意維持cannot數組 
// NOTE: 重定義KNIGHT類的backward() 
virtual void backward(); 
// FUNCTION: 從當前位置根據所選擇的方向推進到下一位置 
// NOTE: 重定義KNIGHT類的forward() 
virtual void forward(); 
// 用來記住某個位置某個方向是否已經試探過 
BOOLEAN cannot[MAX_WIDTH][MAX_WIDTH][MAX_DIR]; 
}; 
FAST_KNIGHT::FAST_KNIGHT(int width): KNIGHT(width) 
{ 
init_cannot(); 
} 
void FAST_KNIGHT::init_cannot() 
{ 
int x, y, dir; 
for (x = 0; x < width; x = x + 1) 
for (y = 0; y < width; y = y + 1) 
for (dir = 0; dir < width; dir = dir + 1) cannot[x][y][dir] = FALSE; 
} 
BOOLEAN FAST_KNIGHT::select_direction() 
{ 
int try_x, try_y, next_x, next_y; 
int dir_index, next_index; 
int min_dir, count; 
min_dir = MAX_DIR; last_direction = MAX_DIR; 
for (dir_index = 0; dir_index < MAX_DIR; dir_index = dir_index + 1) { 
// 選擇一個方向,使得根據該方向推進到下一位置時,在該位置可選的方向最少 
try_x = curr_x + var_x[dir_index]; 
try_y = curr_y + var_y[dir_index]; 
if (is_legal(try_x, try_y) && !cannot[curr_x][curr_y][dir_index]) { 
// 這個位置作為下一位置是合法,那么計算該位置可選的方向 
count = 0; 
for (next_index = 0; next_index < MAX_DIR; next_index++) { 
next_x = try_x + var_x[next_index]; 
next_y = try_y + var_y[next_index]; 
if (is_legal(next_x, next_y)) count = count + 1; 
} 
if (count < min_dir) { 
// 記錄具有最少可選方向的下一位置 
last_direction = dir_index; 
min_dir = count; 
} 
} 
} 
if (last_direction == MAX_DIR) return FALSE; 
else return TRUE; 
} 
void FAST_KNIGHT::backward() 
{ 
int dir; 
step = step - 1; 
chessboard[curr_x][curr_y] = 0; 
// 從位置(curr_x, curr_y)回溯,那么下一次再到達該位置時所有方向都需要重新試探 
for (dir = 0; dir < MAX_DIR; dir = dir + 1) cannot[curr_x][curr_y][dir] = FALSE; 
last_direction = direction[curr_x][curr_y]; 
curr_x = curr_x - var_x[last_direction]; 
curr_y = curr_y - var_y[last_direction]; 
} 
void FAST_KNIGHT::forward() 
{ 
// 該位置的這個方向已經試探過了 
cannot[curr_x][curr_y][last_direction] = TRUE; 
curr_x = curr_x + var_x[last_direction]; 
curr_y = curr_y + var_y[last_direction]; 
chessboard[curr_x][curr_y] = step; 
step = step + 1; 
direction[curr_x][curr_y] = last_direction; 
last_direction = MAX_DIR; 
} 

l 思考與提高 
在充分理解上述三個程序之后,讀者可進一步思考下述問題: 
1.上述求解八皇后問題的程序中數組board不是必須的,因為根據solution數組完全可算出哪個位置有皇后,修改上述程序使得不需要數組board而給出八皇后問題的所有解。 
2.思考快速求解騎士游歷問題中的啟發式規則為什么能夠使得在求解過程中幾乎不回溯。進一步類比該啟發式規則,考慮在求八皇后問題的一個解時可利用怎樣的啟發式規則以加速求解過程。 
3.使用回溯算法求解迷宮問題,自己給出迷宮問題的進一步陳述,設計所需要的數據結構,并細化上述回溯算法。 
4.理解上述快速求解騎士游歷問題的程序,體會在設計算法時的自頂向上分解、逐步求精的思想,進一步體會使用面向對象程序設計思想,特別是利用動態綁定的好處。

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
性做久久久久久免费观看| 久久精品国产秦先生| 亚洲午夜免费福利视频| 一区二区久久久| 日本aⅴ免费视频一区二区三区| 久久爱www久久做| 一本一道综合狠狠老| 日韩亚洲欧美一区二区三区| 久久久夜色精品亚洲| 一区二区三区丝袜| 国产曰批免费观看久久久| 国产精品电影一区二区| 亚洲午夜一区二区| 高清成人免费视频| 2017欧美狠狠色| 亚洲高清一区二区三区| 粉嫩绯色av一区二区在线观看| 欧美天堂亚洲电影院在线播放| 国产亚洲美州欧州综合国| 亚洲午夜久久久久久久久久久| 国产成人综合视频| 欧美精品欧美精品系列| 亚洲免费高清视频在线| 成人网在线免费视频| 91精品久久久久久蜜臀| 亚洲女性喷水在线观看一区| 国产乱码精品一区二区三| 欧美日本视频在线| 夜夜夜精品看看| 成人美女视频在线观看| 欧美视频一区在线观看| 国产亚洲精品超碰| 奇米在线7777在线精品| 色噜噜夜夜夜综合网| 日韩你懂的在线播放| 五月天精品一区二区三区| 色综合天天综合给合国产| 久久久精品黄色| 久久精品免费观看| 欧美成人三级在线| 美日韩一区二区三区| 在线播放一区二区三区| 亚洲一区二区在线观看视频| 99久久国产综合精品麻豆| 中文字幕第一区综合| 国产精品久久久久精k8| 国产99久久精品| 久久看人人爽人人| 高清国产一区二区三区| 国产精品天干天干在观线| 成人小视频在线| 中文字幕一区二区三区不卡 | 99这里都是精品| 2021久久国产精品不只是精品| 蜜臀av一区二区| 精品国产乱子伦一区| 国产在线视频不卡二| 日韩精品一区二区三区四区 | 日韩免费观看高清完整版在线观看 | 在线电影一区二区三区| 天天av天天翘天天综合网色鬼国产| 欧美日韩一卡二卡| 日韩中文字幕麻豆| 精品精品国产高清一毛片一天堂| 日韩国产在线一| 精品国免费一区二区三区| 国产精品一二三四| 国产精品视频免费| 欧美性一级生活| 美女在线一区二区| 久久精品亚洲一区二区三区浴池| 成人免费黄色大片| 亚洲免费观看高清完整版在线观看| 91国产免费看| 午夜电影网一区| 91精品国产乱| 欧美aa在线视频| 日韩女优制服丝袜电影| 国产成人av一区二区三区在线| 亚洲麻豆国产自偷在线| 91麻豆精品国产自产在线观看一区| 日本视频免费一区| 国产精品美女久久福利网站| 成人app软件下载大全免费| 亚洲女与黑人做爰| 日韩一级免费观看| 美脚の诱脚舐め脚责91| 中文字幕中文在线不卡住| 色婷婷激情综合| 亚洲国产精品麻豆| 日韩欧美国产午夜精品| 99久久99精品久久久久久| 亚洲综合在线免费观看| 久久这里都是精品| 欧美日韩一区在线| 懂色av一区二区三区免费看| 五月综合激情日本mⅴ| 国产精品视频一区二区三区不卡| 欧美一区二区在线看| aa级大片欧美| 久久99精品国产麻豆婷婷| 国产欧美日韩在线看| 色一区在线观看| 国产99精品国产| 亚洲欧美乱综合| 国产三级精品三级在线专区| 99久久伊人网影院| 激情综合五月婷婷| 亚洲欧洲日韩在线| 欧美一二三四在线| 欧美亚洲动漫精品| 从欧美一区二区三区| 蜜臀久久久久久久| 亚洲欧洲av在线| 久久精品视频网| 精品久久久久久久久久久久久久久| 成人激情综合网站| 国产在线视频一区二区三区| 日韩精品国产欧美| 国产精品白丝在线| 久久综合色婷婷| 精品久久久网站| 日韩欧美在线影院| 欧美一区二区三区精品| 欧美日高清视频| 欧美日本乱大交xxxxx| 欧美在线制服丝袜| 色av一区二区| 欧美午夜精品一区二区蜜桃| 国产aⅴ精品一区二区三区色成熟| 激情欧美一区二区| 精品一二线国产| 国内精品视频666| 国产成人午夜电影网| 国产成人免费视频网站高清观看视频| 午夜一区二区三区在线观看| 18成人在线视频| 久久夜色精品国产噜噜av| 91精品黄色片免费大全| 在线欧美日韩精品| 成人免费视频app| 成人视屏免费看| 蜜桃av一区二区三区| 免费看日韩精品| 免费成人av在线| 美国欧美日韩国产在线播放| 蜜桃在线一区二区三区| 三级不卡在线观看| 国内精品伊人久久久久影院对白| 麻豆91在线播放免费| 国产乱对白刺激视频不卡| 懂色av一区二区在线播放| 99在线精品视频| 欧美日韩国产成人在线免费| 欧美日韩在线综合| 精品理论电影在线观看| 日韩欧美在线123| 久久综合九色综合久久久精品综合| 久久久久久一二三区| 精品国产一区二区三区久久久蜜月| 制服丝袜日韩国产| 欧美高清在线一区二区| 亚洲免费视频成人| 乱中年女人伦av一区二区| 极品少妇xxxx精品少妇偷拍| 99久久精品国产一区二区三区| 欧美日韩国产欧美日美国产精品| www国产亚洲精品久久麻豆| 国产精品进线69影院| 天天综合天天综合色| 国产成人自拍网| 欧洲一区二区三区在线| 久久综合色鬼综合色| 亚洲综合色在线| 国产在线看一区| 欧洲精品一区二区| 国产亚洲精品aa| 天天av天天翘天天综合网色鬼国产| 国产精品中文字幕一区二区三区| 91欧美一区二区| 久久久精品tv| 午夜视频一区二区| 91在线视频18| 精品久久久久久最新网址| 亚洲一区在线视频| 成人国产精品免费观看动漫| 在线成人高清不卡| 亚洲欧美色图小说| 国产一区二区免费看| 欧美日韩国产经典色站一区二区三区| 久久久久久久久久久电影| 日韩激情视频在线观看| 91香蕉视频mp4| 久久久精品免费网站| 免费成人在线网站| 精品视频123区在线观看| 国产精品久久久久婷婷| 国产99精品国产| 亚洲精品在线一区二区| 裸体健美xxxx欧美裸体表演|