马踏棋盘算法递归+回溯法实现 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 ...
随机推荐
- PAT1028. List Sorting (25)---strcmp
题目链接为:https://www.patest.cn/contests/pat-a-practise/1028 1028. List Sorting (25) Excel can sort reco ...
- Redis开启远程登录连接。
今天使用jedis客户端api连接远程连接redis的时候,一直报错,如下: redis.clients.jedis.exceptions.JedisConnectionException: java ...
- JS 中new一个对象发生了什么事
今天看到一个360的前端面试题: function A(){}function B(a){ this.a=a;}function C(a){ if(a){ this.a=a; }}A.p ...
- MIME协议在邮件中的应用详解
1.定义 全称是多用途互联网邮件扩展(MIME,Multipurpose Internet Mail Extensions),在MIME出台之前,使用RFC 822只能发送基本的ASCII码文本信息, ...
- 基于java的正则表达式
正则表达式概念 正则表达式,又称正规表示法.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式使用单个字符串来描 ...
- Android stdio打开特定网页
博主懒不想打字,直接上程序 package com.example.testopen; import android.app.Activity; import android.os.Bundle; ...
- 利用HTTP-only Cookie缓解XSS之痛
在Web安全领域,跨站脚本攻击时最为常见的一种攻击形式,也是长久以来的一个老大难问题,而本文将向读者介绍的是一种用以缓解这种压力的技术,即HTTP-only cookie. 我们首先对HTTP-onl ...
- 写给Android App开发人员看的Android底层知识(7)
(十二)ContentProvider (1)ContentProvider是什么? ContentProvider,简称CP. 做App开发的同学,尤其是电商类App,对CP并不熟悉,对这个概念的最 ...
- 在node.js中如何屏蔽掉favicon.ico的请求
今天准备用node做个api出来,还没入门,遇到一个小问题,特在此记录一下! 在做路由模块的时候,发现控制台每次都会多输出一条favicon.ico的请求,对于这种又占资源,看着又碍眼的玩意,强迫症完 ...
- [c++]大数运算1---利用C++ string实现任意长度正小数、整数之间的加减法
一.概述 本文属于大大维原创,未经笔者本人允许,严禁转载!!! C/C++中的int类型能表示的范围是-2E31-2E31–1.unsigned类型能表示的范围是0-2E32–1,即 0-429496 ...