问题描述:一个骑士在棋盘中,给予其一个初始位置,求其是否能够走完整个棋盘。

骑士的走法和中国象棋的马走法相同,在前进过程中,骑士在其落足过的地方不能再次落足。

代码如下:

//骑士走棋盘问题,骑士的走法与象棋中马的走法相同,要求骑士便利棋盘中所有的点,但不能重复走一个点两次
//本题采用优先选择+回溯到方法进行,每次最先选择下一次能走路径最少的点
#include <iostream>
using namespace  std;
#define  MAX_SIZE 9
int nAlreayVisit = 0;
int nChessBoard[MAX_SIZE][MAX_SIZE];  //模拟棋盘状况,0表示没有被访问过
int ktmove1[8] = {-2, -1, 1, 2, 2, 1, -1, -2};  //可访问的各个点相对当前点位置
int ktmove2[8] = {1, 2, 2, 1, -1, -2, -2, -1};
//int nArray
void PrintChessBoard()
{
cout<<endl<<"已经访问的位置数目为:"<<nAlreayVisit<<endl;
for (int i = 0; i< MAX_SIZE; i++)
{
for (int j = 0; j < MAX_SIZE; j++)
{
cout<<nChessBoard[i][j]<<" ";
}
cout<<endl;
}
}
//测试该位置有多少个下一步的路径可选
int TestNextWay(int nTestX, int nTestY)
{
int tempX,tempY;
int nRet = 0;
for (int i = 0; i< 8; i++)
{
tempX = nTestX + ktmove1[i];
tempY = nTestY + ktmove2[i];
if (tempX > -1 && tempX < MAX_SIZE && tempY > -1 && tempY < MAX_SIZE && nChessBoard[tempX][tempY] == 0)
{
nRet++;
}
}
return nRet;
}
bool KnightTour(int nStartX, int nStartY)
{
nAlreayVisit++; //当前点被访问了
nChessBoard[nStartX][nStartY] = nAlreayVisit; //表示其被访问的次序
//PrintChessBoard();
if(nAlreayVisit == MAX_SIZE*MAX_SIZE) //棋盘上的所有点都已经被访问过了,返回true
{
return true;
}
//选取下一个要访问的点
int nCanVisit[MAX_SIZE][2];
int nCanNum = 0;  //下一步可以走到选择方法
int tempX,tempY;
int nNextWay = 0;
int NextX, NextY;  //下一步要走的坐标
int nLeastWay = 9;
//选取下下步走法最少的路径
for (int i = 0; i< 8; i++)
{
tempX = nStartX + ktmove1[i];
tempY = nStartY + ktmove2[i];
if (tempX > -1 && tempX < MAX_SIZE && tempY > -1 && tempY < MAX_SIZE && nChessBoard[tempX][tempY] == 0)
{
nCanVisit[nCanNum][0] = tempX;
nCanVisit[nCanNum][1] = tempY;
nCanNum++;
nNextWay = TestNextWay(tempX,tempY);
if (nNextWay < nLeastWay)
{
nLeastWay = nNextWay;
NextX = tempX;
NextY = tempY;
}
}
}
bool bFlag = false;
if (nCanNum == 0) //无法继续走下去了
{
nAlreayVisit--; //当前点访问被撤销
nChessBoard[nStartX][nStartY] = 0;
return false;
}
else
{
bFlag = KnightTour(NextX,NextY);
if (bFlag)
{
return true;
}
else
{
for (int k = 0; k< nCanNum; k++)
{
bFlag = KnightTour(nCanVisit[k][0], nCanVisit[k][1]);
if (bFlag)
{
return true;
}
}
}
}
//遍历完所有可走节点都无法完成
nAlreayVisit--; //当前点访问被撤销
nChessBoard[nStartX][nStartY] = 0;
return false;
}
int main()
{
int x,y;
cout<<"请输入起始位置坐标x和y(即数组的下标,为0到7范围)"<<endl;
cin>>x>>y;
memset(nChessBoard, 0, sizeof(nChessBoard));
if (KnightTour(x,y))
{
cout<<"遍历棋盘成功"<<endl;
PrintChessBoard();
}
else
cout<<"遍历1棋盘失败"<<endl;
system("pause");
}

骑士旅行问题(骑士走棋盘)相关推荐

  1. 骑士周游(马走棋盘)及剪枝分析

    一.题目 在n x n棋盘(有n x n个格点的棋盘)的某个格点上有一个中国象棋马,马走日字. 求一条周游棋盘的路径,使得马能够从起始位置起沿着该路径每个格点恰好走一次最后回到出发位置. 二.思路 1 ...

  2. C++骑士走棋盘Knight tour算法(附完整源码)

    骑士走棋盘Knight tour算法 骑士走棋盘Knight tour算法的完整源码(定义,实现,main函数测试) 骑士走棋盘Knight tour算法的完整源码(定义,实现,main函数测试) # ...

  3. 棋盘算法c语言程序,骑士走棋盘算法

    [c]代码库#include /*骑士走棋盘算法,骑士的走法为西洋棋的走法,骑士可以由任一个位置出发,它要如何走完[所有的位置?*/ /*解法骑士的走法,基本上可以使用递回来解决,但是纯綷的递回在维度 ...

  4. 棋盘算法c语言程序,C语言经典算法 - 骑士走棋盘

    搜索热词 @H_301_0@下面是编程之家 jb51.cc 通过网络收集整理的代码片段.@H_301_0@编程之家小编现在分享给大家,也给大家做个参考. 说明骑士旅游(Knight tour)在十八世 ...

  5. Java算法七:骑士走棋盘

    骑士走棋盘(Knight tour) 问题说明: 骑士游戏,在十八世纪倍受数学家与拼图迷的注意,骑士的走法为西洋棋的走发,骑士可以由任何一个位置出发,它要如何走完所有的位置. 骑士的走法为:先横或竖1 ...

  6. 骑士旅行问题的试探性算法研究

    背景介绍 骑士旅行问题想必大家都很熟悉了吧 这道题的众人向做法就是深度搜索(直接给出一个很C_T风格的代码): #include<iostream> #include<iomanip ...

  7. 旅行,说走就走 Help? [C++数据类型和表达式]

    旅行,说走就走 Help? [C++数据类型和表达式] 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 乐天派.我却喜欢 ...

  8. 骑士周游算法 c语言_C语言经典算法04--骑士走棋盘(骑士旅游:Knight tour)

    说明:骑士旅游(Knight tour)在十八世纪初倍受数学家与拼图迷的注意,它什么时候被提出已不可考,骑士的走法为西洋棋的走法,骑士可以由任一个位置出发,它要如何走完[所有的位置? 解法:骑士的走法 ...

  9. 骑士周游(马踏棋盘)问题

    1,马踏棋盘算法介绍 马踏棋盘问题也被称为骑士周游问题 将马随机放在国际象棋的8*8的棋盘中的某个格子里,马按照走棋规则(日子)进行移动.要求每个方格只进入一次,走遍64个方格 2,马踏棋盘算法思路分 ...

最新文章

  1. Cookie对象的应用
  2. nyoj--586(疯牛) poj --2456
  3. javascript生成指定范围的随机整数
  4. 对寄存器ESP和EBP的一些理解
  5. 信号转化java_Java基础知识回顾-7
  6. everything便携版和安装版区别_什么是超极本?超极本和笔记本的区别科普知识...
  7. 为什么中国企业海外营销都选择Facebook?
  8. DHCP服务器控制企业成本
  9. Shell脚本 条件
  10. 耶路撒冷三千年(笔记)
  11. mysql多表查询去重复数据_SQL重复记录查询 查询多个字段、多表查询、删除重复记录的方法...
  12. Git出现 Your local changes to the following files would be overwritten by merge: con
  13. Sample Science 909 Lab for Mac - 909鼓声虚拟乐器
  14. 基于Android开发的环形进度条(动态显示运动步数)
  15. 【认证/测试】产品的IP等级防水/防尘解析以及测试方法
  16. 数字图像处理之matlab实验(六):图像分割
  17. 2000-2017年全球人口密度数据下载LandScan
  18. 测试数据准备之 CMD 命令:copy(指定尺寸图片1M放大成6M)
  19. dz每个php模板页文件,DZ模板discuz3.2仿魔客吧模板源码-包含DIY文件-价值450元DZ模板discuz3.2仿魔客吧模板...
  20. 弱网测试:使用netem模拟网络延迟、丢包、损坏、重复、和乱序等网络问题

热门文章

  1. 系统的入门脑机接口神经科学,一个网站就够了 - NeuroTechEDU
  2. python将doc导入数据库_用python将路径文件导入mysql数据库表
  3. 【微信小程序】退款功能教程(含申请退款和退款回调)
  4. 业务复习-微信登录/第三方登录实现
  5. Win10电脑怎么更改UEFI固件设置
  6. 怎样用c语言写高速超速罚款标准,如何做到科一满分一把过?超速扣分题必须掌握!...
  7. 清除input numer 点击样式
  8. JAVA计算机毕业设计阿尔兹海默病Mybatis+系统+数据库+调试部署
  9. 解决0x80070035找不到网络路径
  10. python批量添加姓名生成奖状批量处理图片教师学生奖状