马踏棋盘算法递归+回溯法实现 C语言
r为矩阵的行,c为矩阵的列
将结果输出到当前目录下的results.txt。
结果将给出:1.是否存在路径使马可以按要求走遍所有的方格;
2.解的总数;
3.程序执行的时间;
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
#define r 2
#define c 4 int flag[r][c]={};//存放马跳路径的二维数组
int arr[r][c]={};
int x[]={,,-,-,,,-,-};
int y[]={,,,,-,-,-,-};
int n=,count;
FILE *fp; //初始化文件输出流
int initOut()
{
fp=fopen("results.txt","w"); //记得关闭
if(fp==NULL)
{
printf("File cannot open! " );
exit();
}
return ;
} //添加一个判断函数,判断这样的哈密顿路径是否存在
void judgeExistence(){
if(count==)
printf("%d * %d 的棋盘不存在能使得马可以不重复遍历完棋盘中每一格的路径\n",r,c);
} //输出马跳的步骤stepOut()
void stepOut(){
for(int a=;a<r;a++){
for(int b=;b<c;b++)
{
fprintf(fp,"%3d ",arr[a][b]);
}
fprintf(fp,"\n");
}
fprintf(fp,"\n");
} void DFS(int i,int j)
{
if(n==r*c)
{
count++;
stepOut();//写个函数,输出马跳的步骤stepOut()
} else
for(int k=;k<;k++)
{
if(i+x[k]>=&&i+x[k]<r&&j+y[k]>=&&j+y[k]<c&&flag[i+x[k]][j+y[k]]==)
{
flag[i+x[k]][j+y[k]]=;n++;
arr[i+x[k]][j+y[k]]=n;//给记录马跳步骤的矩阵赋值 DFS(i+x[k],j+y[k]);//循环+递归 flag[i+x[k]][j+y[k]]=;n--;
}
}
} void main()
{
clock_t start, finish; //计算程序一共花费了多少时间
long duration;
start=clock(); count=;
int X,Y;
label_1:printf("请输入马初始横坐标(X<=%d):X=\n",r);
scanf("%d",&X);
if(X>r){
printf("请输入小于等于%d的数\n",r);
goto label_1;
}
label_2:printf("请输入马初始纵坐标(Y<=%d):Y=\n",c);
scanf("%d",&Y);
if(Y>c){
printf("请输入小于等于%d的数\n",c);
goto label_2;
}
X=X-;
Y=Y-;
flag[X][Y]=;
arr[X][Y]=; initOut();
DFS(X,Y);
judgeExistence();
fprintf(fp,"解的总数为:%d\n",count); finish=clock();
duration=finish-start;//程序执行的时间,单位毫秒
fprintf(fp,"程序执行的时间为:%10ld ms\n",duration);
fclose(fp);
}
代码中有哪些不正确的地方欢迎大家指正。
马踏棋盘算法递归+回溯法实现 C语言的更多相关文章
- python 回溯法 子集树模板 系列 —— 18、马踏棋盘
问题 将马放到国际象棋的8*8棋盘board上的某个方格中,马按走棋规则进行移动,走遍棋盘上的64个方格,要求每个方格进入且只进入一次,找出一种可行的方案. 分析 说明:这个图是5*5的棋盘. 图片来 ...
- 马踏棋盘问题-贪心(MATLAB&C++)
原创文章,转载请注明:马踏棋盘问题-贪心(MATLAB&C++) By Lucio.Yang 1.问题描述 将马随机放在国际象棋的Board[0-7][0-7]的某个方格中,马按走棋规则进行移 ...
- 剑指Offer_12_矩阵中的路径(参考问题:马踏棋盘)
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵 ...
- java实现马踏棋盘问题
1.问题描述: 在国际象棋中,马走日,用户输入棋盘的起始位置从x:0-4,y:0-3输出从这一点开始,马走完整个棋盘的各个方案,并输出方案数 2.输入样式: 请输入棋盘马起始位置: 0 0 3.输出样 ...
- C++代码审查---审查孙晓宁马踏棋盘谜题程序
与孙晓宁同学结对审查,其代码地址如下:https://github.com/brunnhilder/-1/blob/master/%E9%A9%AC%E8%B8%8F%E6%A3%8B%E7%9B%9 ...
- 马踏棋盘--dfs
[问题描述]关于马踏棋盘的基本过程:国际象棋的棋盘为 8*8 的方格棋盘.现将"马"放在任意指定的方格中,按照"马"走棋的规则将"马"进行移 ...
- C语言递归回溯法迷宫求解
本例将随机产生一个10*10的迷宫输出后,在下面输出此迷宫的解法. 解法为从坐标(1,1)处进入,从(8,8,)出去,优先线路为先右后下再上最后为左. 不少人求解此题时运用的栈的相关知识,本例寻找线路 ...
- 算法之--回溯法-迷宫问题【python实现】
题目描述 定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, ...
- poj 1321 棋盘问题 (回溯法)
棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 69951 Accepted: 33143 Descriptio ...
随机推荐
- 初次使用git配置以及git如何使用ssh密钥(将ssh密钥添加到github)
初次安装git配置用户名和邮箱 初次安装git需要配置用户名和邮箱,否则git会提示:please tell me who you are. 你需要运行命令来配置你的用户名和邮箱: $ git con ...
- SpringMVC构建Restful。
因为spring是依赖jackson来生成json,需要添加jar包. pom.xml文件添加依赖. <dependency> <groupId>org.codehaus.ja ...
- 个人对于epollhup的理解
1.原因 由于最近对于异步connect函数的测试,发现提前将一个套接字加入epoll监听队列会不断爆出epollhup事件 2.示例 ........ iEpoll = epoll_create( ...
- shiro权限控制(一):shiro介绍以及整合SSM框架
shiro安全框架是目前为止作为登录注册最常用的框架,因为它十分的强大简单,提供了认证.授权.加密和会话管理等功能 . shiro能做什么? 认证:验证用户的身份 授权:对用户执行访问控制:判断用户是 ...
- 看透SpringMVC源代码分析与实践 Markdown记录
kantouspringmvc 看透SpringMVC中文版电子书,使用Markdown语法记录学习<看透SpringMVC>的内容,方便自己整理知识,并在原作者写作的基础上添加自己的理解 ...
- Ubuntu热键控制spotify播放和音量调节
安装xbindkeys sudo apt-get install xbindkeys 新建配置文件 xbindkeys -d > ~/.xbindkeysrc 编辑热键 vim ~/.xbind ...
- Spring MVC动态切换数据源(多数据库类型)
最近由于项目需求,需要将Sql Server 和 Mysql 两种数据库整合到一个项目,项目的用到的框架是SSM. 因此尝试了利用AOP切面来切每次执行的Servcie方法,根据Service所在的包 ...
- elasticsearch 不能通过9200端口访问
修改配置文件 config/elasticsearch.yml network.host: 0.0.0.0
- SpringMVC——数据校验
数据校验在web应用里是非常重要的功能,尤其是在表单输入中.在这里采用Hibernate-Validator进行校验,该方法实现了JSR-303验证框架支持注解风格的验证. 一.导入jar包 若要实现 ...
- Zepto源码分析-架构
构造函数 Zepto.js 是专门为智能手机浏览器推出的javascript库, 拥有与和jQuery相似的语法. 它的优点是精简,压缩后5-10K. 不支持IE MIT开源协议 结构 http: ...