资源简介
【问题描述】
骑士巡游问题:从国际象棋棋盘上任意给定的方格开始移动骑士,相继地到达所有的64个方格,进入每个方格一次且仅进入一次。
代码片段和文件信息
#include
#include
using namespace std;
const int n = 8; //n*n的棋盘
int a[n+1][n+1]; //二维数组表示棋盘,不使用0行0列
int move[9][3]; //移动偏移量(增量)。为方便起见,只使用其中1-8行、1-2列(不用0行0列)
bool possible; //是否摆放成功
void go(int i int j int k bool &possible)
{
/*从(ij)点出发,做第k至第n*n次的移动
若成功则通过引用参数q返回true*/
int v = 0gh; //v(取值1-8)表示方向,(gh)表示从当前点(ij)沿v方向移动后到达点的坐标
do
{
v++;
possible = false;
g = i + move[v][1];
h = j + move[v][2];
if (g >= 1 && g <= n && h >= 1 && h <= n && a[g][h] == 0) //(gh)处于棋盘内,且尚未放过棋子
{
a[g][h] = k; //将第k步棋子放在(gh)点
if (k < n * n) //尚未放满整个棋盘
{
go(ghk+1possible); //递归调用
if(!possible) //如果找不到解,利用回溯法把数组都赋0值
a[g][h] = 0;
}
else //放满整个棋盘,possible返回true
possible = true;
}
}
while(!possible && (v != 8)); //循环的条件是possible为false(因为没有找到最后解之前possible都为false),并且v不为8表示没有遍历所有方向
}
int main()
{
//初始化move数组
move[1][1] = 2; move[1][2] = 1;
move[2][1] = 1; move[2][2] = 2;
move[3][1] = -1; move[3][2] = 2;
move[4][1] = -2; move[4][2] = 1;
move[5][1] = -2; move[5][2] = -1;
move[6][1] = -1; move[6][2] = -2;
move[7][1] = 1; move[7][2] = -2;
move[8][1] = 2; move[8][2] = -1;
cout << “Please input the first position:“ << endl;
int x1y1;
cin >> x1 >> y1; //输入初始坐标
a[x1][y1] = 1; //在棋盘(x1y1)处放下棋子(第1步棋)
go(x1 y1 2 possible); //从(x1y1)出发,做第2至第25次的移动,若成功possible返回true
//若摆放成功,输出棋盘(移动过程)
if (possible)
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
cout << setw(4) << a[i][j];
cout << endl;
}
else //摆放不成功
cout << “Impossible!“ << endl;
system(“pause“);
return 0;
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 38912 2010-12-09 15:51 Knight\Debug\Knight.exe
文件 394952 2010-12-09 15:51 Knight\Debug\Knight.ilk
文件 584704 2010-12-09 15:51 Knight\Debug\Knight.pdb
文件 7120 2010-12-09 15:51 Knight\Knight\Debug\BuildLog.htm
文件 663 2010-12-09 15:07 Knight\Knight\Debug\Knight.exe.em
文件 728 2010-12-09 15:07 Knight\Knight\Debug\Knight.exe.em
文件 621 2010-12-09 15:51 Knight\Knight\Debug\Knight.exe.intermediate.manifest
文件 41010 2010-12-09 15:51 Knight\Knight\Debug\Knight.obj
文件 69 2010-12-09 15:51 Knight\Knight\Debug\mt.dep
文件 166912 2010-12-09 15:51 Knight\Knight\Debug\vc90.idb
文件 217088 2010-12-09 15:51 Knight\Knight\Debug\vc90.pdb
文件 2357 2010-12-09 15:51 Knight\Knight\Knight.cpp
文件 3934 2010-12-09 15:06 Knight\Knight\Knight.vcproj
文件 1417 2010-12-09 15:58 Knight\Knight\Knight.vcproj.CHENGXIONG.Administrator.user
文件 1166336 2010-12-09 15:58 Knight\Knight.ncb
文件 884 2010-12-09 15:06 Knight\Knight.sln
..A..H. 8192 2010-12-09 15:58 Knight\Knight.suo
目录 0 2010-12-09 15:51 Knight\Knight\Debug
目录 0 2010-12-09 15:09 Knight\Debug
目录 0 2010-12-09 15:51 Knight\Knight
目录 0 2010-12-09 15:07 Knight
----------- --------- ---------- ----- ----
2635899 21
相关资源
- 黑板风格,管道风格,调用返回风格
- 哈工程本科算法实验-0-1背包动态规划
- 0-1 Knapsack 试设计一个用回溯法搜索
- 回溯法、遗传算法、CSP最小冲突法解
- TSP回溯法实现从武汉出发,进行34个省
- 图的m着色问题 回溯法
- 用回溯法解决TSP问题
- 回溯法背包问题非递归实现
- 试设计一个用回溯法搜索排列空间树
- 有向图的全部拓扑序列(回溯法)
- 回溯法专题
- 回溯法求解骑士巡游问题
- 分别用回溯法和分支限界法求解0-1背
- acm培训资料,题目分类,递归分治策
- 求两点之间的所有路径(广度优先与
- 子集树问题 试设计一个用回溯法搜
- 回溯法求解TSP问题
- 回溯法解决旅行商问题
- 用回溯法解决N色方柱
- 数据结构课程设计八皇后的求解
- 算法分析之 0_1背包问题回溯法
- 0-1背包问题回溯法
- 八皇后问题的LasVegas算法与回溯法的混
- 经典算法 分支限界法 分治法 动态规
- 回溯法基站频率问题.sln
评论
共有 条评论