当前位置: 首页 > article >正文

马踏棋盘c++

马踏棋盘c++

  • 题目
  • 回溯问题模型
    • 特征
    • 模型
  • 代码

题目

  • 马踏棋盘算法,即骑士周游问题。
  • 将马放在国际象棋的 8×8 棋盘的某个方格中,马按走棋规则(马走日字)进行移动。
  • 每个方格只进入一次,走遍棋盘上全部 64 个方格。

回溯问题模型

特征

  • 解组织成树的形式
  • 从根节点开始进行深度优先遍历
  • 访问节点时进行判断,是否符合条件,符合就继续,否则进行回溯,此节点后的都不用访问(与暴力算法的区别,降低算法复杂度)

模型

在这里插入图片描述

代码

  • 代码演示的是5*5的棋盘。
  • 递归的出口为步数k=棋盘数M*M。
  • 递归主函数就是对每一坐标的8种走法进行判断。符合条件就调用递归函数。
  • 然后回溯上一步。
  • map变量ma记录棋盘上的每一个坐标是否走过。没有走过的,将其坐标加入map中,成为键,值记录第几步。
#include<iostream>
#include<map>
#include<iomanip> //出输格式设定 
using namespace std;
struct Pos{//定义坐标点
	int x;
	int y;
	Pos(int x,int y){
		this->x=x;
		this->y=y;
	}
}; 
int count=0;//记录一共有多少种解法
void show(int M,map<Pos,int>& ma);
//马的8种走法
Pos delta[]={Pos(-1,2),Pos(-1,-2),Pos(1,2),Pos(1,-2),
			Pos(2,1),Pos(2,-1),Pos(-2,1),Pos(-2,-1)};
//运算符重载 
Pos operator+(Pos a,Pos b){
	return Pos(a.x+b.x,a.y+b.y);
}
//马走的步法是否有效,如果出了格子表示bad,即为true
bool outOfBounds(int M,Pos p){
	if(p.x<0 || p.x>= M) return true;
	if(p.y<0 || p.y>= M) return true;
	return false;
}
//自定义变量Pos需要用map,则须重载<,确保Pos能比较大小 
bool operator< (Pos a,Pos b){
	if(a.x != b.x) return a.x < b.x;
	return a.y < b.y;
}
//bool operator<(const Pos& p) const{
//	if(this->x !=p.x) return this->x < p.x;
//	return this->y < p.y;
//}
bool f(int M,map<Pos,int>& ma,Pos p,int k){
	if(k==M*M){
		++count;
		cout<< count<<endl;
		show(M,ma);
		return true;
	} 		
	for(int i=0;i<8;i++){
		Pos p1=p+delta[i];
		if(outOfBounds(M,p1)) continue;
		if(ma.count(p1)) continue;
		ma[p1] = k+1;
		f(M,ma,p1,k+1);
		ma.erase(p1);
	}
	return false;
}
void show(int M,map<Pos,int>& ma){
	for(int i=0;i<M;i++){
		for(int j=0;j<M;j++){
			cout <<setw(3)<<ma[Pos(i,j)];
		}
		cout<<endl;
	}
	cout<<"********************"<<endl;
}
void horse(int M){
	map<Pos,int> ma;
	Pos p(0,0);
	ma[p]=1;
	f(M,ma,p,1); 		
}
int main(){
	horse(5);
	cout<<"总共有:"<<count<<"种走法"; 
	return 0;
}

http://www.kler.cn/news/313667.html

相关文章:

  • Ubuntu上使用qt和opencv显示图像
  • MySQL —— 事务
  • RabbitMQ Spring客户端使用
  • 多版本node管理工具nvm
  • C#_封装详解
  • 人话学Python-循环语句
  • 数据结构(Day14)
  • 掌握C#中的动态规划技术
  • 监控易监测对象及指标之:全面监控DB2_linux数据库
  • Scikit-learn (`sklearn`) 教程
  • 二级C语言2024-3易错题
  • 小叶OJ 2716: 过河问题 ← 贪心算法
  • Liveweb视频汇聚平台支持GB28181转RTMP、HLS、RTSP、FLV格式播放方案
  • nodejs 013:Prect 样式复用(multiple classes)例子
  • yolo自动化项目实例解析(二)ui页面整理 1.78
  • macOS Sequoia 正式版(24A335)黑苹果/Mac/虚拟机系统镜像
  • 2024华为杯E题:高速公路应急车道紧急启用模型
  • Broadcast:Android中实现组件及进程间通信
  • 使用 Anaconda 环境在Jupyter和PyCharm 中进行开发
  • 【计算机网络】网络层协议解析
  • NVM(node.js版本工具)的使用
  • 虚拟机ens33网卡不显示inet地址(已设置NOBOOT为yes)
  • 蓝桥杯2024省C
  • IDEA 2024.3 EAP新特征早览!
  • 音视频入门基础:AAC专题(4)——ADTS格式的AAC裸流实例分析
  • 微信小程序05-常用API下
  • EmguCV学习笔记 VB.Net 12.2 WeChatQRCode
  • 【FPGA】编程方式
  • Django学习实战篇六(适合略有基础的新手小白学习)(从0开发项目)
  • AUTOSAR_EXP_ARAComAPI的5章笔记(7)