C++骑士游历问题的示例分析
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这篇文章主要介绍了C++骑士游历问题的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。骑士游历问题:在国际棋盘上使一个骑士遍历所
千家信息网最后更新 2025年01月23日C++骑士游历问题的示例分析
这篇文章主要介绍了C++骑士游历问题的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
骑士游历问题:在国际棋盘上使一个骑士遍历所有的格子一遍且仅一遍,对于任意给定的顶点,输出一条符合上述要求的路径
解题思路:
这是一道经典的遍历问题(DFS),由于题目要求遍历全部,那么肯定要做标记,因此立马想到DFS深度优先算法。具体思路如下:
①了解国际象棋以及国际象棋骑士的走法
国际象棋和中国象棋,大同小异,毕竟中国象棋是老祖先。国际象棋棋子放在格子中,中国象棋放在点上,且国际象棋有64个格子。国际象棋的骑士和中国象棋的马功能相当,都可以走八个方位。走法是走"日"字,或英文字母大写的"L"形:即先向左(或右)走1格,再向上(或下)走2格;或先向左(或右)走2格,再向上(或下)走1格。与中国象棋的馬不同,国际象棋的马可以跳过路上的其他棋子,不受拐脚的限制。
解题需要我们可以把格子抽象成一个点,那么国际象棋的骑士走法就是一个日字。
②设置标记
初始化数组,让每个元素初始化为0,并且初始化一个记录骑士遍历次数的cal也为0
int cal = 0; //统计走的顺序//初始化为0int chress[8][8] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
③判断是否超界和是否被访问
bool ifOut(int x, int y) //判断是否出界{ if (x >= 0 && x <= 7 && y >= 0 && y <= 7) return false; else return true;}bool ifVisited(int x, int y) //判断是否被访问{ if (chress[x][y] != 0) return true; else return false;}
④递归主体
void dfs(int x,int y){ if (cal == 64) //如果遍历完则退出棋盘一共64个位置 return; if (!ifVisited(x, y) && !ifOut(x, y)) //如果没有被访问且没有出界 则访问 { cal++; chress[x][y] = cal; //做标记 dfs(x + 2, y + 1); //骑士走法有八个方位,故八个 方位都遍历 dfs(x - 2, y - 1); //八个递归的顺序可以改,顺序不一样,结果不一样 dfs(x + 2, y - 1); dfs(x - 2, y + 1); dfs(x - 1, y - 2); dfs(x + 1, y - 2); dfs(x + 1, y + 2); dfs(x - 1, y + 2); return; } else //else其中包括已经被访问了,和没有被访问且在界外的 return;}
⑤总代码如下(编译器vs2013)
#include"stdafx.h"#include#include using namespace std;int cal = 0; //统计走的顺序//棋盘初始化为0做标记int chress[8][8] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};bool ifOut(int x, int y) //判断是否出界{ if (x >= 0 && x <= 7 && y >= 0 && y <= 7) return false; else return true;}bool ifVisited(int x, int y) //判断是否已经被访问{ if (chress[x][y] != 0) return true; else return false;}void dfs(int x,int y){ if (cal == 64) //如果遍历完则退出棋盘一共64个位置 return; if (!ifVisited(x, y) && !ifOut(x, y)) //如果没有被访问且没有出界 则访问 { cal++; chress[x][y] = cal; //做标记 dfs(x + 2, y + 1); //骑士走法有八个方位,故八个 方位都遍历 dfs(x - 2, y - 1); //八个递归的顺序可以改,顺序不一样,结果不一样 dfs(x + 2, y - 1); dfs(x - 2, y + 1); dfs(x - 1, y - 2); dfs(x + 1, y - 2); dfs(x + 1, y + 2); dfs(x - 1, y + 2); return; } else //出界了则退出return return;}int main(){ int x, y; cout << "请输入骑士初始的位置:"; while (1) { cin >> x >> y; //输入坐标 if (x > 7 || x<0 || y> 7 || y < 0) cout << "初始位置输入错误请重新输入" << endl; else break; } dfs(x,y); for (int i = 0; i < 8; i++) //输出打印测试 { for (int j = 0; j < 8; j++) cout << setw(2)< ⑥测试截图:
感谢你能够认真阅读完这篇文章,希望小编分享的"C++骑士游历问题的示例分析"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!
象棋
骑士
国际
国际象棋
顺序
中国象棋
方位
标记
走法
中国
问题
格子
棋盘
篇文章
递归
输入
示例
C++
分析
个位
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全防护注意事项
确保意识形态和网络安全
网络安全等保2.0标准体系
机关单位网络安全工作制度和要求
互联网网络安全风险评估
戴尔服务器原厂副厂
计算机三级网络技术获证条件
2015年网络技术大事件
陕西电信服务器哪个牌子好
安卓免费vpn服务器
港澳台dns服务器ip
安卓 ios软件开发
慕课网络安全课程答案题库
服务器网络测试
守恒互联网科技有限公司
数据库中数据定义实验报告
双路服务器电脑拆卸
抖音张无忌web网络安全套路
杭州落基网络技术
支付宝的服务器在国内吗
彩虹引擎怎么修改数据库
网络安全专业挂科率高吗
怀化软件开发培训地址
html自动保存到服务器
网络安全联盟解除
网络安全和网络舆情工作
电脑cti服务器
网络安全保卫局张宏业
php读取数据库6
福州创飞网络技术有限公司