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

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

?? knight.cpp

?? 這個代碼也是很簡單的,主要用來進行C++教學使用的. 僅供大家參考一下.
?? CPP
字號:
// KNIGHT.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream.h>
#include <iomanip.h>

enum BOOLEAN 
{
	FALSE =0,
	TRUE =10
};

const int MAX_WIDTH = 30;
const int MAX_DIR = 8;

class KNIGHT 
{
  public:

	KNIGHT(int width);		// 設置初始狀態
	
	void print();			// 打印問題的解
	
	// 根據馬的起始位置(start_x, start_y)使用回溯算法求騎士游歷問題的一個解
	// (start_x, start_y)必需在所設置的棋盤寬度范圍內
	BOOLEAN tourist(int start_x, int start_y);

protected:
	void init_direction();		// 初始化記錄所選方向的數組,將每個值置為MAX_DIR
	
	void init_chessboard();		// 初始化記錄馬在第幾步到位每個位置的數組,將每個值置為0
	
	void set_start(int x, int y);	// 設置初始狀態,包括初始化方向數組和棋盤數組,并設置馬的初始位置
	
	// 在當前位置選擇一個方向以推進到下一位置
	// 如果可選擇一個方向推進則返回TRUE,否則返回FALSE
	// 將該函數定義為虛函數,以便下面快速游歷的類來重定義該函數而產生動態綁定
	virtual BOOLEAN select_direction();
	
	// 從當前位置回溯到上一位置
	// 將該函數定義為虛函數,以便下面快速游歷的類來重定義該函數而產生動態綁定
	virtual void backward();
	
	// 從當前位置推進到下一位置
	// 將該函數定義為虛函數,以便下面快速游歷的類來重定義該函數而產生動態綁定
	virtual void forward();
	
	// 判斷馬是否能夠走向位置(x, y)。
	// 如果馬已經到過該位置,或該位置超出棋盤范圍返回FALSE,否則返回TRUE
	BOOLEAN is_legal(int x, int y);
	
	// 判斷是否回溯到初始狀態
	// 如果步數回到第1步則表示回到初始狀態而返回TRUE,否則返回FALSE
	BOOLEAN back_to_start();
	
	// 判斷是否游歷完所有位置
	// 如果步數等于棋盤格子數則表示游歷完所有位置而返回TRUE,否則返回FALSE
	BOOLEAN is_end();
	
	// 下面兩個數組用來記住選擇某個方向后,推進到下一位置時x方向和y方向的值的變化
	int var_x[MAX_DIR];
	int var_y[MAX_DIR];
	
	int chessboard[MAX_WIDTH][MAX_WIDTH];	// 記錄馬第幾步到達某個位置的棋盤數組
	
	int direction[MAX_WIDTH][MAX_WIDTH];	// 記錄馬在某個位置是在上一位置選擇第幾個方向到達的
	int width; 				//棋盤寬度
	int curr_x, curr_y; 			//馬的當前位置
	int step; 				//已經游歷的步數
	int last_direction; 			//上一位置到當前位置所選的方向
	int total_step;
};

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<<endl;
	
	for (x = 0; x < width; x = x + 1) 
	{
		cout << " |";

		for (y = 0; y < width; y = y + 1) 
			cout << setw(3) << chessboard[x][y] << " |";

		cout << endl;
		cout << " +";

		for (y = 0; y < width; y = y + 1) 
			cout << "----+";
		
		cout << endl;
	}
}

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];
	
	// 根據這個方向回溯到上一位置,同時回溯到上一位置之后,在上一位置再試探時應該從
	// last_direction+1的方向開始。參看成員函數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];
	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;
	for (x = 0; x < width; x = x + 1) 
	{
		for (y = 0; y < width; y = y + 1) 
		{
			chessboard[x][y] = 0;
		}
	}
}
// 使用回溯算法快速求解騎士游歷問題
class FAST_KNIGHT: public KNIGHT 
{
  public:
	FAST_KNIGHT(int width);
  
  protected:
	void init_cannot();		// 初始化cannot數組
	
	// 在當前位置根據啟發式規則選擇一個方向以推進到下一位置
	// 如果可選擇一個方向推進則返回TRUE,否則返回FALSE
	// 重定義KNIGHT類的select_direction()
	virtual BOOLEAN select_direction();
	
	// 從當前位置回溯到上一位置,注意維持cannot數組
	// 重定義KNIGHT類的backward()
	virtual void backward();
	
	// 從當前位置根據所選擇的方向推進到下一位置
	// 重定義KNIGHT類的forward()
	virtual void forward();
	
	BOOLEAN cannot[MAX_WIDTH][MAX_WIDTH][MAX_DIR];	// 用來記住某個位置某個方向是否已經試探過
};

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;
}

FAST_KNIGHT::FAST_KNIGHT(int width): KNIGHT(width)
{
	init_cannot();
}

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;
}

int main()
{
	int width = 8;
	FAST_KNIGHT knight(width);
	int start_x, start_y;
	cout << "\nProgram begin..."<<endl;
	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 << endl;
	}
	
	return 1;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色哟哟亚洲精品| 成人免费视频视频| 中文字幕一区二区三区不卡| 日韩欧美成人一区| 欧美一区二区视频观看视频| 欧美日韩国产大片| 欧美日韩日日夜夜| 欧美日韩一区在线观看| 在线观看亚洲一区| 欧美午夜电影网| 欧美群妇大交群的观看方式| 欧美日韩mp4| 欧美一级午夜免费电影| 日韩一区二区免费高清| 久久亚洲精精品中文字幕早川悠里| 日韩欧美黄色影院| 国产亚洲成aⅴ人片在线观看 | 色婷婷精品久久二区二区蜜臀av| 成人黄色av网站在线| 97se狠狠狠综合亚洲狠狠| 91精品1区2区| 91精品国产综合久久小美女| 精品国产91乱码一区二区三区| 精品国产精品一区二区夜夜嗨| 久久色在线观看| 自拍偷在线精品自拍偷无码专区| 亚洲精品中文字幕在线观看| 日韩专区中文字幕一区二区| 久久精品国产**网站演员| 狠狠狠色丁香婷婷综合激情 | 欧美色偷偷大香| 欧美一区二视频| 国产午夜亚洲精品不卡| 亚洲人成网站精品片在线观看| 亚洲午夜精品网| 精品一区二区免费视频| 97精品电影院| 日韩三级视频中文字幕| 国产精品国产a级| 天涯成人国产亚洲精品一区av| 国产综合久久久久久鬼色 | 日韩精品一级中文字幕精品视频免费观看| 同产精品九九九| 国产不卡视频在线观看| 91精品黄色片免费大全| ●精品国产综合乱码久久久久| 青青青爽久久午夜综合久久午夜| 成人黄色在线看| 欧美一区二区视频观看视频| 亚洲精品国产第一综合99久久 | 亚洲一区二区中文在线| 国产裸体歌舞团一区二区| 在线亚洲+欧美+日本专区| 精品成人在线观看| 亚洲二区在线观看| 成人福利电影精品一区二区在线观看| 欧美日韩精品欧美日韩精品一综合| 国产日韩高清在线| 蜜臀av一区二区三区| 色噜噜狠狠色综合欧洲selulu| 亚洲精品在线电影| 秋霞午夜鲁丝一区二区老狼| 色婷婷综合久色| 中文字幕制服丝袜一区二区三区 | 国产综合久久久久久久久久久久| 欧美日韩一区小说| 亚洲激情欧美激情| 色综合天天综合网国产成人综合天| 久久久亚洲精华液精华液精华液| 亚洲成人黄色小说| 日本国产一区二区| 亚洲综合免费观看高清完整版在线 | 国产精品色哟哟网站| 久久国产精品99精品国产| 欧美日韩久久一区| 亚洲成a人在线观看| 日本黄色一区二区| 中文字幕综合网| www..com久久爱| 一区在线播放视频| av在线不卡观看免费观看| 国产三区在线成人av| 国产精品77777| 2017欧美狠狠色| 国产69精品久久99不卡| 国产精品麻豆久久久| 成人a免费在线看| 亚洲三级电影全部在线观看高清| 成人h精品动漫一区二区三区| 国产精品美女一区二区三区| 成人av片在线观看| 亚洲男同1069视频| 欧美三级三级三级爽爽爽| 午夜亚洲福利老司机| 日韩视频免费观看高清完整版 | 色菇凉天天综合网| 亚洲成人手机在线| 精品黑人一区二区三区久久| 成人综合激情网| 中文字幕一区二区三区av| 91激情五月电影| 日本va欧美va欧美va精品| 国产丝袜在线精品| 一本久久综合亚洲鲁鲁五月天| 亚洲一区二区精品视频| 91精品国产黑色紧身裤美女| 国产精品一区二区免费不卡| 综合久久给合久久狠狠狠97色| 欧美日韩精品一区二区天天拍小说| 日本欧美韩国一区三区| 久久久综合精品| 欧美在线999| 老司机精品视频一区二区三区| 久久综合色鬼综合色| 91丨九色丨尤物| 日韩精品成人一区二区三区 | 亚洲欧美日韩人成在线播放| 欧美一区二区三区人| 不卡的av中国片| 日本v片在线高清不卡在线观看| 久久久久久黄色| 欧美色中文字幕| 国产sm精品调教视频网站| 亚洲午夜三级在线| 久久久久久毛片| 欧美日韩成人高清| 91蜜桃婷婷狠狠久久综合9色| 毛片av一区二区三区| 亚洲日本丝袜连裤袜办公室| 精品剧情在线观看| 欧美中文字幕一区二区三区| 国产成人一区二区精品非洲| 天天色图综合网| 依依成人精品视频| 国产亚洲短视频| 精品美女在线观看| 884aa四虎影成人精品一区| 97精品久久久久中文字幕| 国产资源在线一区| 日本不卡一区二区三区| 亚洲美女屁股眼交3| 国产精品视频一二三区| 欧美成人精品二区三区99精品| 欧美视频一区二区在线观看| 91污在线观看| 99久久精品国产精品久久| 豆国产96在线|亚洲| 国产在线不卡视频| 九九久久精品视频| 捆绑紧缚一区二区三区视频| 日本aⅴ精品一区二区三区 | 六月丁香婷婷久久| 视频在线观看一区二区三区| 香蕉影视欧美成人| 亚洲国产一区二区在线播放| 亚洲在线一区二区三区| 一区二区三区四区亚洲| 亚洲欧美另类久久久精品 | 亚洲成a人片在线观看中文| 亚洲色图19p| 一级精品视频在线观看宜春院| 中文字幕五月欧美| 亚洲乱码国产乱码精品精可以看 | 香蕉久久夜色精品国产使用方法 | 国产精品主播直播| 国产麻豆精品在线观看| 国产一区二区三区国产| 国产一区二区伦理| 国产二区国产一区在线观看| 国产suv精品一区二区6| www.一区二区| 欧美色窝79yyyycom| 91精品国产综合久久香蕉的特点| 91精品国产丝袜白色高跟鞋| 日韩精品一区二区在线观看| 久久综合久久99| 国产精品久久久久久久久免费丝袜 | 成人一区二区在线观看| 成人自拍视频在线| 在线一区二区三区做爰视频网站| 欧美日韩精品一区二区三区蜜桃 | 亚洲精品亚洲人成人网在线播放| 亚洲一区二区黄色| 美女尤物国产一区| 不卡视频一二三| 在线不卡免费av| 久久精品亚洲国产奇米99| 亚洲视频一区二区在线| 奇米色一区二区| 国产91丝袜在线播放九色| 欧美在线观看一区二区| 国产婷婷色一区二区三区在线| 亚洲乱码国产乱码精品精98午夜 | eeuss鲁一区二区三区| 欧美日韩专区在线| 欧美国产精品劲爆| 日本最新不卡在线| 成人av网址在线| 日韩欧美在线网站| 一级中文字幕一区二区|