马踏棋盘是经典的程序设计问题之一,主要的解决方案有两种:一种是基于深度优先搜索的方法,另一种是基于贪婪算法的方法。第一种基于深度优先搜索的方法是比较常用的算法,深度优先搜索算法也是数据结构中的经典算法之一,主要是采用递归的思想,一级一级的寻找,最后找到合适的解。而基于贪婪的算法则是依据贪婪算法的思想设置一种标准,然后依据标准进行选择,从而得到解,但是他不一定能够得到最优解。

关于马踏棋盘的基本过程:国际象棋的棋盘为8*8的方格棋盘。现将"马"放在任意指定的方格中,按照"马"走棋的规则将"马"进行移动。要求每个方格只能进入一次,最终使得"马"走遍棋盘的64个方格。

深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次. (来自百度)本文引用地址:http://www.eepw.com.cn/article/201612/324536.htm

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。(来自百度)

其中基于深度优先搜索的算法就是依据当前点找到下一个可能的点,然后对这个点进行深度优先搜索,然后依次递归,当出现条件不满足时,退回来,采用其他的路劲进行搜索,最后肯定能够得到对应的结果。实现的基本过程如下:

/*deepsearch to solve the horse chessproblem*/

#include#include#include#define ROWS 8

#define COLS 8

int chess[ROWS][COLS];

/*eight directions of x moved*/

const int x_move[] = {-2,-1,1,2,2,1,-1,-2};

/*eight directions of y moved*/

const int y_move[] = {1,2,2,1,-1,-2,-2,-1};

void print_matrix()

{

int i = 0,j = 0;

for (i = 0; i < ROWS; ++ i)

{

for (j = 0; j < COLS; ++ j)

{

printf("%d",chess[i][j]);

}

printf("");

}

}

/*find the next point*/

intnextxy(int *x,int *y,int count)

{

if(count > 7 && count < 0)

return -1;

switch(count)

{

case 0:

/*check the conditions*/

if(*x + x_move[0] < ROWS &&

*x + x_move[0]>= 0 &&

*y + y_move[0]< COLS &&

*y + y_move[0]>= 0 &&

chess[*x + x_move[0]][*y + y_move[0]] == 0)

{

*x += x_move[0];

*y += y_move[0];

break;

}

else/*failed*/

return 0;

case 1:

if(*x + x_move[1] < ROWS &&

*x + x_move[1]>= 0 &&

*y + y_move[1]< COLS &&

*y + y_move[1]>= 0 &&

chess[*x + x_move[1]][*y + y_move[1]] == 0)

{

*x += x_move[1];

*y += y_move[1];

break;

}

else

return 0;

case 2:

if(*x + x_move[2] < ROWS &&

*x + x_move[2]>= 0 &&

*y + y_move[2]< COLS &&

*y + y_move[2]>= 0 &&

chess[*x + x_move[2]][*y + y_move[2]] == 0)

{

*x += x_move[2];

*y += y_move[2];

break;

}

else

return 0;

case 3:

if(*x + x_move[3] < ROWS &&

*x + x_move[3]>= 0 &&

*y + y_move[3]< COLS &&

*y + y_move[3]>= 0 &&

chess[*x + x_move[3]][*y + y_move[3]] == 0)

{

*x += x_move[3];

*y += y_move[3];

break;

}

else

return 0;

case 4:

if(*x + x_move[4] < ROWS &&

*x + x_move[4]>= 0 &&

*y + y_move[4]< COLS &&

*y + y_move[4]>= 0 &&

chess[*x + x_move[4]][*y + y_move[4]] == 0)

{

*x += x_move[4];

*y += y_move[4];

break;

}

else

return 0;

case 5:

if(*x + x_move[5] < ROWS &&

*x + x_move[5]>= 0 &&

*y + y_move[5]< COLS &&

*y + y_move[5]>= 0 &&

chess[*x + x_move[5]][*y + y_move[5]] == 0)

{

*x += x_move[5];

*y += y_move[5];

break;

}

else

return 0;

case 6:

if(*x + x_move[6] < ROWS &&

*x + x_move[6]>= 0 &&

*y + y_move[6]< COLS &&

*y + y_move[6]>= 0 &&

chess[*x + x_move[6]][*y + y_move[6]] == 0)

{

*x += x_move[6];

*y += y_move[6];

break;

}

else

return 0;

case 7:

if(*x + x_move[7] < ROWS &&

*x + x_move[7]>= 0 &&

*y + y_move[7]< COLS &&

*y + y_move[7]>= 0 &&

chess[*x + x_move[7]][*y + y_move[7]] == 0)

{

*x += x_move[7];

*y += y_move[7];

break;

}

else

return 0;

default:

return 0;

}

return 1;

}

int deepsearch(int x,int y, int j)

{

/*save the value x,y*/

int x1 = x, y1 = y;

int tag = 0, i = 0;

/*save j on chess[x][y]*/

chess[x][y] = j;

/*recursion exit condition*/

if(j == COLS*ROWS)

{

return 1;

}

/*find the next point in eight directions*/

tag = nextxy(&x1,&y1,i);

/*find the nextx,nexty */

while (tag == 0 && i < 7)

{

i ++;

tag =nextxy(&x1,&y1, i);

}

/*the nextxy be found*/

while(tag)

{

if(deepsearch(x1,y1,j+1))

return 1;

/*if failed, a new finding process */

x1 = x; y1 = y;

i ++;

tag = nextxy(&x1,&y1,i);

while (tag == 0 && i < 7)

{

i ++;

tag = nextxy(&x1,&y1,i);

}

}

/*no direction can findnextpoint*/

if(tag == 0)

chess[x][y] = 0;

return 0;

}

void main()

{

clock_t start = clock();

deepsearch(2,0,1);

print_matrix();

int seconds = (clock()-start)/CLOCKS_PER_SEC;

printf("%d",seconds);

return;

}

java 马踏棋盘_马踏棋盘的实现相关推荐

  1. java马士兵笔记_马士兵java教程笔记4

    File 类 Java.io.File 类代表系统文件名 File类的常见构造方法: Public File(String pathname)以pathname为路径创建File对象,如果pathna ...

  2. java马士兵笔记_马士兵java教程笔记2

    ---恢复内容开始--- 抽象类 用abstract关键字来修饰一个类时,这个类叫做抽象类,用abstract来修饰一个方法时,该方法叫做抽象方法 含有抽象方法的类必须被声明为抽象类,抽象类必须被继承 ...

  3. python绘制黑白棋盘_生成黑白棋盘标定图和单目相机标定(python+opencv实现)

    学习记录. 事实上很早就接触过视觉定位这东西,但是到现在才返回头学习一下相机的标定,真是可耻啊!我把想法和过程记录一下. 相机成像 相机的成像原理--小孔成像 然而,在实际由于设计工艺问题.相机安装环 ...

  4. 代码 马佳义_马佳义 教授

    马佳义,武汉大学电子信息学院教授.博导,中组部"青年拔尖人才支持计划"入选者.2008年6月和2014年6月分别于华中科技大学获得理学学士和工学博士学位.2012年9月至2013年 ...

  5. c#与马扎克通讯_马扎克伺服报警

    以下报警说明伺服控制回路发生错误 PC显示LED显示名称详细 S010011S111PCB错误1放大器内的PCB发生错误S010013S113软件处理超时,时钟错误放大器内的时钟发生错误 S01001 ...

  6. JAVA代码—算法基础:马走8×8棋盘问题

    经典问题:给定一个8×8棋盘,马从任意位置开始,走"日"字,不重复的走完棋盘上的所有位置. 如图所示: 假设从坐标为(2,2)的点开始走,有8个方向可以选择.所以每次都要依据这最多 ...

  7. java象棋代码注释_中国象棋程序的设计与实现(十一)--棋盘绘制算法(尽管注释非常详细,完全理解仍有难度)...

    上几篇中,我们详细介绍了,棋盘类的定义和关键属性,简要介绍了棋盘绘制算法的骨架. 本篇,我们将详细解读棋盘绘制算法的每一个细节. 强烈建议,大家结合文章末尾的"棋盘截图"来思考绘制 ...

  8. Java高并发编程 (马士兵老师视频)笔记(一)同步器

    本篇主要总结同步器的相关例子:包括synchronized.volatile.原子变量类(AtomicXxx).CountDownLatch.ReentrantLock和ThreadLocal.还涉及 ...

  9. 棋盘覆盖算法java_棋盘覆盖问题(算法分析)(Java版)

    1.问题描述: 在一个2k×2k个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个特殊棋盘.显然特殊方格在棋盘上出现的位置有种情形.因而对任何 k≥0,有4k种不 ...

  10. python 讲义 马永亮_资源 | 177G Python/机器学习/深度学习/算法/TensorFlow等视频,涵盖入门/中级/项目各阶段!...

    8. 西安交大应用统计分析SPSS1-48讲 9. Python科学计算 10. Neural Network for Machine Learning (英文字幕) 11. python教程(马永亮 ...

最新文章

  1. SAP SD交货单凭证流里的Confirmation of Service初探 II
  2. DirectX 3D相关资源参考
  3. java解析lrc_java中用正则表达式解析LRC文件
  4. XCTF-Web-高手区-shrine
  5. Java 并发总结——线程池
  6. 计算机组成原理实验软件仿真系统_计算机系统组成原理(基础)
  7. 华为手机下拉菜单变大_手机投屏到电视最好的方法和手机可同屏也可电视当电脑手机当鼠标...
  8. 数据库基本SQL语句大全
  9. 安装linux版qq,安装二进制包编译器,安装mysql-5.6.11,删除已安装或安装失败的mysql-5.6.11,简单mysql练习题...
  10. 软考高项--第一章项目整体管理
  11. 模糊控制器原理笔记(附简单demo以及MATLAB相关操作)
  12. JSP:9个隐含对象(隐含变量)
  13. Intent的设想与天马行空
  14. U盘PE系统的制作和安装(win7、win10)
  15. 2022年Web 前端怎样入门?最新Web前端入门的学习路线
  16. 乐动机器人 2D DTOF激光雷达 LD06、LD19驱动包开源仓库分享
  17. 多传感器数据融合发展综述
  18. 论文阅读《API2Com: On the Improvement of Automatically Generated Code Comments Using API Documentations》
  19. 老九学堂 学习C++ 第六天
  20. 引入mybatis-plus报 Invalid bound statement错误怎么办,动动手指改一个地方就行

热门文章

  1. burpsuite有些网站抓不到包解决办法
  2. 第45周 ARTS 2019 08 25
  3. 带视觉ABB机器人西门子PLC立库码垛机伺服 SCL和梯形图混编
  4. 前端工程师--系统学习文档
  5. Unity --- 场景/场景管理类 与 异步场景加载法
  6. 帝国cms系统限制的登录次数不得超过5次请等60分钟过后方可重新登录
  7. catkin_make报错
  8. java计算机毕业设计基于web的面向公众的食品安全知识系统源程序+mysql+系统+lw文档+远程调试
  9. Unity-SteamVR中激光效果的制作
  10. 中国累计扑杀生猪91.6万头 农业农村部:非洲猪瘟对市场影响有限