马踏棋盘---c语言
问题描述:
国际象棋的棋盘为8x8的方格棋盘。现将“马”放在任意指定的方格中,按照“马”走棋的规则将“马”进行移动。要求每个方格只能进入一次,最终使得“马”走遍棋盘的64个方格。
编写一个c程序,实现马踏棋盘操作,要求1~64这64个数字标注马移动的路径,也就是按照求出的行走路线,将数字1,2,3,......,64依次填入棋盘的方格中,并输出。
问题分析:
国际象棋中,“马”的移动规则如下图所示
1 | 2 | |||
8 | 3 | |||
10 | ||||
7 | 4 | |||
6 | 5 |
途中10代码“马”的位置,它下一步可移动到图中其他八个位置上,该规则叫做“马走日”。但是如果“马”位于棋盘的边界附件,那么它下一步可移动到的位置就不一定有8个了,因为要保证“马”每一步都走在棋盘中
马踏棋盘的问题其实就是要将1,2,3,.......,64填入到一个8x8的矩阵中,要求相邻的两个数按照“马”的移动规则放置在矩阵中。
例如数字 a放置在矩阵(i,j)位置上,数字a+1只能放置在矩阵的(i-2,j+1),(i-1,j+2),(i+1,j+2),(i+2,j+1),(i+2,j-1),(i+1,j-2),(i-1,j-2),(i-2,j-1)之中的一个位置上。将矩阵填满并输出。
这样在矩阵中从1,2,......遍历到64,就得到了马踏棋盘的行走路径。因此本题的最终目的是输出一个8*8的矩阵,在该矩阵中填有1,2,......64这64个数字,相邻数字之间遵循“马走日”的规则。
算法设计:
解决马踏棋盘问题的一种比较容易理解的方法是应用递归的深度优先搜索的思想。因为“马”每走一步都是盲目的,它并不能判断当前的走步一定正确,而只能保证当前这步是可走的。
“马”走的每一步棋都是从它当前位置出发,向下一步的8个位置中的1个行走(在它下一步有8个位置可走的情况下)。因此“马”当前所走的路径并不一定正确,因为它可能还有剩下的可选路径没有尝试“马”的行走过程实际上就是一个深度探索的过程。“探索树”的跟节点为“马”在棋盘中的初始位置。
接下来“马”有两种行走方式,于是根节点派生出两个分支。而再往下一步行走,根节点的两个孩子又能够分别派生出其他不同的“行走路线”分支,如此派生下去,就得到了“马”的所有可能的走步状态。
可以想见,该探索树的叶子节点只可能有两种状态:一是该节点不能再派生出其他的“走步”分支了,也就是“马”走不通了;二是棋盘中的每个方格都被走到,即“马”踏遍棋盘。于是从该探索树的根节点到第二种情况的叶节点构成的路径,就是马踏棋盘的行走过程。
如何才能通过搜索这棵树探索树,找到这条马踏棋盘的行走路径呢?可以采用深度优先搜索的方法以先序的方式访问树中的各个节点,直到访问到叶节点。
如果叶节点是第二种情况的叶节点,则搜索过程可以结束,因为找到了马踏棋盘的行走路径;如果叶节点为第一种情况的叶节点,即走不通了,则需要返回到上一层的节点,顺着该节点的下一条分支继续进行深度优先搜索下去。
因此再设计“马踏棋盘”的算法时可以借鉴图的深度优先遍历算法和二叉树的先序遍历算法。但是在这里并不需要真正地构建这样一棵探索树,只需要借用探索树地思想。
在实际地操作过程中,所谓的探索树实际就是深度优先搜索地探索路径,每个节点实际就是当前地棋盘状态,而所谓地叶节点或者是在当前棋盘状态下,“马”无法再进行下一步行走;或者是马踏棋盘成功。
完整程序:
备注:因为程序涉及深度搜索,运行中叶节点不能再派生出其他的“走步”分支时,也就是“马”走不通了,则返回上一节点,比较复杂,运行较慢。(一般需要一分钟左右出现结果,请耐心等待。)
#include <stdio.h>
#define X 8
#define Y 8
int chess[X][Y];
int nextxy(int *t,int *y,int count)/**/
{
switch(count)
{
case 0;
if(*x+2<=X-1 && *y-1<=0 && chess[*x+2][*y-1] == 0)
{
*x = *x + 2;
*y = *y - 1;
return 1;
}
break;
case 1;
if(*x+2<=X-1 && *y+1<=Y-1 && chess[*x+2][*y+1] == 0)
{
*x = *x + 2;
*y = *y + 1;
return 1;
}
break;
case 2;
if(*x+1<=X-1 && *y-2>=0 && chess[*x+1][*y-2] == 0)
{
*x = *x + 1;
*y = *y - 2;
return 1;
}
break;
case 3;
if(*x+1<=X-1 && *y+2<=Y-1 && chess[*x+1][*y+2] == 0)
{
*x = *x + 1;
*y = *y + 2;
return 1;
}
break;
case 4;
if(*x-2>=0 && *y-1>=0 && chess[*x-2][*y-1] == 0)
{
*x = *x - 2;
*y = *y - 1;
return 1;
}
break;
case 5;
if(*x-2>=0 && *y+1<=Y-1 && chess[*x-2][*y+1] == 0)
{
*x = *x - 2;
*y = *y + 1;
return 1;
}
break;
case 6;
if(*x-1>=0 && *y-2>=0 && chess[*x-1][*y-2] == 0)
{
*x = *x - 1;
*y = *y - 2;
return 1;
}
break;
case 7;
if(*x-1>=0 && *y+2<=Y-1 && chess[*x-1][*y+2] == 0)
{
*x = *x - 1;
*y = *y + 2;
return 1;
}
break;
default;
break;
}
return 0;
}
int TravelChessBoard(int x,int y,int tag)/**/
{
int x1=x,y1=y,flag=0,count=0;
chess[x][y]=tag;
if(tag == X*Y)
{
return 1;
}
flag = netxy(&x1,&y1,count);
while(flag == 0 && count < 7)
{
count = count + 1;
flag = netxy(&x1,&y1,count);
}
while(flag)
{
if(TravelChessBoard(x1,y1,tag+1))
return 1;
x1 = x;
y1 = y;
count = count + 1;
flag = netxy(&x1,&y1,count);/**/
while(flag == 0 && count < 7)
{
count = count + 1;
flag = netxy(&x1,&y1,count);
}
}
if(flag == 0)
chess[x][y] = 0;
return 0;
}
int main()
{
int i,j;
for(i=0;i<X;i++)
for(j=0;j<Y;j++)
chess[i][j]=0;
if(TravelChessBoard(2,0,1))
{
for(i=0;i<Y;i++)
{
for(j=0;j<Y;j++)
printf("%-5d",chess[i][j]);
printf("\n");
}
printf("The horse has travel the chess board\n");
}
else
printf("The horse has travel the chess board\n");
return 0;
}
运行结果:
43 50 47 38 57 52 61 32
48 37 44 51 46 33 58 53
1 42 49 56 39 60 31 62
36 15 40 45 34 29 54 59
41 2 35 16 55 24 63 30
14 5 12 9 22 19 28 25
3 10 7 20 17 26 23 64
6 13 4 11 8 21 18 27
The horse has travel the chess board
此文章内容以及实例来源于《c语言学习app》,谢谢共享
马踏棋盘---c语言相关推荐
- 数据结构与算法|马踏棋盘算法(小甲鱼)C语言代码的算法分析
马踏棋盘算法(骑士周游问题)的算法分析 C语言代码部分来自小甲鱼的<数据结构与算法> 文章目录 马踏棋盘算法(骑士周游问题)的算法分析 一.C语言代码实现 二.代码分析与算法思路 题目要求 ...
- c语言马踏棋盘编程分析,C语言马踏棋盘实现
原标题:C语言马踏棋盘实现 问题描述 国际象棋的棋盘为8×8的方格棋盘.现将"马"放在任意指定的方格中,按照"马"走棋的规则将"马"进行移动 ...
- c语言数据结构之马踏棋盘
c语言数据结构之马踏棋盘 马踏棋盘游戏 (一)思路: 马随机放在国际象棋的 8×8 棋盘 Board[07][07]的某个方格中,马按走棋规则进行移动.要求每个方格只进入一次,走遍棋盘上全部 64 个 ...
- c语言字符马图案,C语言实现马踏棋盘
//马踏棋盘主要要考虑三个因素: //第一:马走的位置用Move数组表示,以及棋盘的大小不再是8*8,而是12*12: //第二:只要找到马可以踏的下一个位置,就进行递归,只有一只进行递归,这是一种理 ...
- 马踏棋盘问题的程序c语言,C语言马踏棋盘
问题描述 国际象棋的棋盘为8×8的方格棋盘.现将"马"放在任意指定的方格中,按照"马"走棋的规则将"马"进行移动.要求每个方格只能进入一次, ...
- 数据结构——马踏棋盘题解(贪心算法)(C语言)
数据结构--马踏棋盘题解(贪心算法) 使用循环建立棋盘与权值棋盘(权值为该位置可走的位置数量) 将当前步数写入棋盘数组中 开始探测下一步该走的位置, 分别测试八个方向 对可走位置进行查询权值,将权值最 ...
- 【大话数据结构C语言】43 图的应用 - 马踏棋盘算法
欢迎关注我的公众号是[CodeAllen],关注回复[1024]获取资源 程序员技术交流①群:736386324 ,程序员技术交流②群:371394777 题目要求: 国际象棋的棋盘为8*8的方格棋盘 ...
- 【算法篇】/*一篇博客带你详细了解马踏棋盘问题*/(java语言实现)
[前言]本文部分内容引用于b站尚硅谷老师的资料,如有侵权,请及时联系作者! hello大家好! 我依然是你们熟悉的槿凉.那么最近呢由于躺平了几天,也没有来得及更新博客,没有办法啦!学校封的严严实实,闷 ...
- 用贪心算法解决马踏棋盘问题
用贪心算法解决马踏棋盘问题 参考文章: (1)用贪心算法解决马踏棋盘问题 (2)https://www.cnblogs.com/Allen-win/p/7095293.html 备忘一下.
最新文章
- 深度学习发现古人类遗址,AI 考古比胡八一更高效
- OpenCV findContours函数参数
- 上拉电阻和下拉电阻的作用详解
- 归纳+记忆:让机器像人一样从小样本中学习
- 【Tools】Tools博客汇总
- oracle将字段nullable设为Y,从DB模型中消除NULLable列的选项(为了避免SQL的三值逻辑)?...
- [转载] Java-forEach增强for循环是值传递规则详解
- 【转】 一定要让孩子知道的20个小故事
- Table控件布局DataList模板
- CxImage图像库的使用
- java8新特性——Optional (1)
- cocos creator 打包apk_Cocos Creator Android打包 apk
- php在线安装ipa,网页安装ipa
- 华为“不造车”的承诺,快到期了
- hackintosh技巧
- 短址服务实现的一些算法
- 工信部专项认证有什么用?
- 入职一家初创公司第一周的血与泪
- STM32外部中断的关闭和打开
- 常见web中间件 HTTP 限制请求方法 配置
热门文章
- 系统采集--行程单、火车票、汽车票方案
- Fragment的适配器adap
- 【Android UI】Path 测量 PathMeasure ② ( PathMeasure API 简介 | nextContour 函数 | getPosTan 函数 ★ | 曲线切线处理 )
- win10系统CompatTelRunner或task scheduler占用CPU过高的解决方法
- 2018年中国STEAM教育行业发展现状及发展前景分析
- 禁止浏览器自动填充密码框密码
- 代码详解:如何用Python快速制作美观、炫酷且有深度的图表
- 公众号内容拓展学习笔记(2021.4.8)
- 易语言子程序公开c语言,易语言调用DLL未公开的子程序
- 粉姐个人单曲《0度的死角》发行 个人IP打造咨询师惊喜跨界音乐