马踏棋盘算法递归+回溯法实现 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 ...
随机推荐
- 重庆/北京/江苏KS/快乐时时/七星/福运来菠菜电商开奖修复APP网站SSC网站程序开发php
网站制作是指使用标识语言(markup language),通过一系列设计.建模.和执行的过程将电子格式的信息通过互联网传输,最终以图形用户界面(GUI)的形式被用户所浏览.简单来说,网页设计的目的就 ...
- redis-key相关命令
本篇主要介绍和redis的key进行操作的相关命令. 命令 描述 复杂度 返回值 DEL key [key ...] 删除给定的一个或多个 key .不存在的 key 会被忽略.删除单个列表.集合.有 ...
- 深入理解IOC
1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机 ...
- java内存模型6-final
与前面介绍的锁和volatile相比较,对final域的读和写更像是普通的变量访问.对于final域,编译器和处理器要遵守两个重排序规则: 在构造函数内对一个final域的写入,与随后把这个被构造对象 ...
- ASP.NET MVC5路由系统机制详细讲解
请求一个ASP.NET mvc的网站和以前的web form是有区别的,ASP.NET MVC框架内部给我们提供了路由机制,当IIS接受到一个请求时,会先看是否请求了一个静态资源(.html,css, ...
- GTD:让大脑用来思考,而不是用来记事!
前段时间听刘润大师分享了一套GTD时间管理方法理论,感觉非常受用!现拿来跟大家分享下,这套方法是刘润老师践行20多年总结提炼的精华,经亲自实践确实行之有效. 俗话说:工欲善其事,必先利其器!人生也是如 ...
- XSS研究2-来自内部的XSS攻击的防范
引入: 前面我们分2篇文章分别探讨了来自外部的XSS攻击和来自内部的XSS攻击,现在我们来专门探讨如何防范来自内部的XSS攻击. 实践: http://www.cnblogs.com/crazy ...
- SparkMLlib回归算法之决策树
SparkMLlib回归算法之决策树 (一),决策树概念 1,决策树算法(ID3,C4.5 ,CART)之间的比较: 1,ID3算法在选择根节点和各内部节点中的分支属性时,采用信息增益作为评价标准.信 ...
- 2016计蒜之道复赛B题:联想专卖店促销
题解 思路: 二分答案,设我们要check的值为x. 注意到每一个礼包都有,一个U盘,一个鼠标. 剩余的,分别为一个机械键盘,一个U盘,一个鼠标. 当礼包数目为x时,我们至多可以提供a-x个普通,b- ...
- [HDU1002] A + B Problem II
Problem Description I have a very simple problem for you. Given two integers A and B, your job is to ...