原创文章,转载请注明:马踏棋盘问题-贪心(MATLAB&C++) By Lucio.Yang

1.问题描述

  将马随机放在国际象棋的Board[0~7][0~7]的某个方格中,马按走棋规则进行移动,走遍棋盘上全部64个方格。编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入一个8×8的方阵,输出之。

2.matlab代码

clear all
clc
chessboard=zeros(8);%初始化
DirX=[2 1 -1 -2 -2 -1 1 2];%方向向量
DirY=[1 2 2 1 -1 -2 -2 -1];
stack(1).x=0;
stack(1).y=0;
horse(chessboard,DirX,DirY,stack)

main.m

function horse(chessboard,DirX,DirY,stack)%程序入口
x=1;%X,Y用来表示初始位置的坐标
y=1;
step=1;%step表示走的步数
init();
chessboard(x,y)=step;%第一步
%应用贪心算法来求解
for step=2:64
i=mix(x,y,DirX,DirY,chessboard);%求从某点出发可走的方向中,出口数最小的方向
x=x+DirX(i);
y=y+DirY(i);
stack(step).x=x;
stack(step).y=y;
chessboard(x,y)=step;
end
print(chessboard,stack);%打印结果 function init(chessboard)%初始化棋盘,将所有的格子初始化为零
chessboard=zeros(8); function mixdir=mix(x,y,DirX,DirY,chessboard)%传入参数为某点的坐标,函数返回从该点出发的所有可行的方向中,出口数最小的方向
mixdir=0;%mixdir记录最小出口数的方向
mixnumber=9;%mixnumber记录该方向的出口数,也即所有方向中最小的出口数
for i=1:8
if isok(x+DirX(i),y+DirY(i),chessboard)
temp=outnumber(x+DirX(i),y+DirY(i),DirX,DirY,chessboard);
if temp && temp=1 && x<=8 && y>=1 && y<=8 && chessboard(x,y)==0
result=1;
else
result=0;
end function print(chessboard,stack)%打印数据
disp(chessboard)
for i=1:64
fprintf('第%d步,x=%d,y=%d\n',i,stack(i).x,stack(i).y)
end

horse.m

3.c++代码

#include
#include
#include
using namespace std;
/*-------------------------------------棋盘的定义---------------------------------------------*/
int DirX[]={2,1,-1,-2,-2,-1,1,2}; //数组依次记录八个可走方向的横坐标
int DirY[]={1,2,2,1,-1,-2,-2,-1}; //数组依次记录八个可走方向的纵坐标
int chessboard[8][8]; //定义了一个8*8的棋盘
/*--------------------------------------马的进步函数--------------------------------------------*/
void init(); //初始化,主要是将棋盘各点置零
int outnumber(int m,int n); //求从某一点出发,可以有多少条路径可走
int mix(int m,int n); //求一方向,从该方向出发,到达的点,可以走的路径数目最小
void print(); //打印棋盘结果
bool isok(int m,int n); //判断某个方向是否可行
/*--------------------------------------主函数--------------------------------------------*/
void main()
{
cout<<"******************************马踏棋盘*********************************";
int x=0,y=0,step=1,i=0; //X,Y用来表示初始位置的坐标,step表示走的步数,i为一代用变量
char ch; //判断输入的坐标是否正确
init(); //用户的输入过程 chessboard[x][y]=step; //记录初始位置,将该点的坐标定义为步数step
for(step=2;step<65;step++)
{ //应用贪心算法来求解,没有回溯过程
i=mix(x,y); //求从某点出发可走的方向中,出口数最小的方向
x+=DirX[i]; //前进一步
y+=DirY[i]; chessboard[x][y]=step;
//print(); //打印每一步的棋盘结果,
}
print(); //走完64步,利用贪心算法一定会有解,故无回溯,直接打印结果
//退出这个程序 } void init() //初始化棋盘,将所有的格子初始化为零
{
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
chessboard[i][j]=0;
} int mix(int m,int n) //传入参数为某点的坐标,函数返回从该点出发的所有可行的方向中,出口数最小的方向
{ //出口数为某点可走的方向数
int mixdir=0,mixnumber=9,a=0; //mixdir记录最小出口数的方向,mixnumber记录该方向的出口数,也即所有方向中最小的出口数
for(int i=0;i<8;i++)
{
if(isok((m+DirX[i]),(n+DirY[i])))
{ //首先判断某个方向是否可行
a=outnumber((m+DirX[i]),(n+DirY[i])); //计算该方向的出口
if(a&&(a<mixnumber))
{ //如果该方向可行并且该方向的出口数比已知的最小的出口数小
mixnumber=a; //将mixnumber改为该出口数
mixdir=i; //将该方向记录为最小出口数方向
}
}
}
if(mixdir==0)
{ //此步骤针对最后一步,当step=63时,由于所有方向的出口数均为零,故需要特殊考虑
for(int i=0;i<8;i++)
if(isok ((m+DirX[i]),(n+DirY[i])))
return i;
}
return mixdir; //返回最小出口数的方向 } int outnumber(int m,int n) //函数针对传入的坐标,返回从该点出发所有可行的方向数,即出口数
{
int flag=0; //flag记录方向数
for(int i=0;i<8;i++) //八个方向都遍历一遍
if(isok((m+DirX[i]),(n+DirY[i])))
flag++; //如果某个方向可行,出口数+1
return flag; //返回出口数
} bool isok(int m,int n) //判断该点是否已经走过,也即某个方向是否可行,可行返回1,否则返回0
{
if((m>=0)&&(m<8)&&(n>=0)&&(n<8)&&(chessboard[m][n]==0))
return 1; //没有出棋盘的边缘,并且没有走过,即为可行
else return 0;
} void print() //将棋盘的信息打印,也即将走满的格子中的步数信息显示出来
{
for(int i=0;i<8;i++){
cout<<endl;
cout<<endl;
for(int j=0;j<8;j++)
{
cout.width(6);
cout<<chessboard[i][j]; }
}
cout<<endl;
cout<<endl;
}

马踏棋盘问题-贪心(MATLAB&C++)的更多相关文章

  1. 剑指Offer_12_矩阵中的路径(参考问题:马踏棋盘)

    题目描述  请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵 ...

  2. java实现马踏棋盘问题

    1.问题描述: 在国际象棋中,马走日,用户输入棋盘的起始位置从x:0-4,y:0-3输出从这一点开始,马走完整个棋盘的各个方案,并输出方案数 2.输入样式: 请输入棋盘马起始位置: 0 0 3.输出样 ...

  3. C++代码审查---审查孙晓宁马踏棋盘谜题程序

    与孙晓宁同学结对审查,其代码地址如下:https://github.com/brunnhilder/-1/blob/master/%E9%A9%AC%E8%B8%8F%E6%A3%8B%E7%9B%9 ...

  4. python 回溯法 子集树模板 系列 —— 18、马踏棋盘

    问题 将马放到国际象棋的8*8棋盘board上的某个方格中,马按走棋规则进行移动,走遍棋盘上的64个方格,要求每个方格进入且只进入一次,找出一种可行的方案. 分析 说明:这个图是5*5的棋盘. 图片来 ...

  5. 马踏棋盘--dfs

    [问题描述]关于马踏棋盘的基本过程:国际象棋的棋盘为 8*8 的方格棋盘.现将"马"放在任意指定的方格中,按照"马"走棋的规则将"马"进行移 ...

  6. 马踏棋盘算法递归+回溯法实现 C语言

    r为矩阵的行,c为矩阵的列 将结果输出到当前目录下的results.txt. 结果将给出:1.是否存在路径使马可以按要求走遍所有的方格: 2.解的总数: 3.程序执行的时间: #include< ...

  7. day53-马踏棋盘

    马踏棋盘 1.算法优化的意义 算法是程序的灵魂,为什么有些程序可以在海量数据计算时,依旧保持高速计算? 编程中算法很多,比如八大排序算法(冒泡.选择.插入.快排.归并.希尔.基数.堆排序).查找算法. ...

  8. 【BZOJ4813】[CQOI2017]小Q的棋盘(贪心)

    [BZOJ4813][CQOI2017]小Q的棋盘(贪心) 题面 BZOJ 洛谷 题解 果然是老年选手了,这种题都不会做了.... 先想想一个点如果被访问过只有两种情况,第一种是进入了这个点所在的子树 ...

  9. 【NOI2015】荷马史诗[Huffman树+贪心]

    #130. [NOI2015]荷马史诗 统计 描述 提交 自定义测试 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读 ...

随机推荐

  1. String类的实现,内部采用字符数组实现

    #include <iostream> using namespace std; class String{ public: String(const char *str = NULL); ...

  2. printf("%d, %d\n", i++, ++i)的输出结果是确定的吗???

    1. 问题描述 以下代码的输出结果是什么? 题目1: ; printf("%d, %d\n", i++, ++i); 题目2: ; printf("%d, %d, %d, ...

  3. MFC数据类型(data types)

    为便于理解MFC库函数中的各种形参,现将MFC中常见的参数类型总结如下: 下面这些是和Win32程序(SDK程序)共同使用的数据类型: 数据类型 意义 BOOL Boolean值(布尔值,不是TRUE ...

  4. ASP.NET实现列表页连接查询 拼接sql语句 绑定grivdView

    ASP.NET实现列表页连接查询 拼接sql语句 如图效果: 基本需求:1.当页面第一次加载的时候默认查询一个月时间(或者说是登陆者所属权限的所有数据)的数据绑定到gridView 2.添加查询条件时 ...

  5. 权威指南之脚本化jquery

    jqury函数 jquery()($())有4种不同的调用方式 第一种是最常用的调用方式是传递css选择器(字符串)给$()方法.当通过这种方式调用时,$()方法会返回当前文档中匹配该选择器的元素集. ...

  6. 现在网页中流行的css3样式

    1.鼠标放在圆形图片中,图片渐渐的变方形[17素材头像的特效,觉得不错就研究下来了 ———— 17sucai.com] img{border-radius:50%;transition: all .4 ...

  7. Matlab中K-means聚类算法的使用(K-均值聚类)

    K-means聚类算法采用的是将N*P的矩阵X划分为K个类,使得类内对象之间的距离最大,而类之间的距离最小. 使用方法:Idx=Kmeans(X,K)[Idx,C]=Kmeans(X,K) [Idx, ...

  8. 2014.9.25DOM元素操作

    2.操作样式class a.className=”block” class样式,代码赋值的方式 (五)找相关元素 a.nextSibling 下一层,下一个同辈元素 a.previousSibling ...

  9. MMDrawerController 的实践,已经实现,几行简单的代码实现侧栏

    学习方法,看readme,看给的Demo 看功能怎么实现的去模仿,个人感觉模仿是最快的学习方法 废话少说,上代码 导入MMDrawerController框架我就不多少了,之后做什么才是我们才关注的事 ...

  10. Apache 编译扩展的方法

    下载源码包 进入源码包的modules目录 选择你要编译的.c文件 eg: /home/work/local/apache/bin/apxs -c -i -a mod_proxy_http.c 选项说 ...