c语言数据结构之马踏棋盘

马踏棋盘游戏
(一)思路:
马随机放在国际象棋的 8×8 棋盘 Board[07][07]的某个方格中,马按走棋规则进行移动。要求每个方格只进入一次,走遍棋盘上全部 64 个方格。,求出马的行走路线,并按求出的行走路线,将数字 1,2,…,64 依次填入一个 8×8 的方阵,输出之。

(二)步骤分析
1、马踏棋盘问题(骑士周游问题)实际上是图的深度优先搜索(DFS)的应用。
2、解决步骤与思路:
(1)创建棋盘(chessBoard),是一个二维数组,创建栈用于存储访问顺序和用于回朔;
(2)将当前位置设置为已经访问,然后根据当前位置,计算马能走哪些位置,并放入到一个,最多有8个位置,每走一步,就使用top+1;
(3)通过贪心算法进行优化:根据当前这一步的所有的下一步的选择位置,进行非递减排序(例如:1,2,2,2,3,3,4就属于非递减排序);
(4)遍历栈中存放的所有位置,看看哪个可以走通,如果走通,就继续,走不通,就回溯;
(5)判断马是否完成了任务,使用top和应该走的步数比较,如果没有达到数量,则表示没有完成任务,将整个棋盘置为0。

/*** @file 马踏棋盘.c* @author IT小阳* @brief * @version 0.1* @date 2022-06-27* * @copyright Copyright (c) 2022* * 每次选择位置都是最优解* */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define Row 8
#define Col 8
#define maxStep 64typedef struct
{int abscissa;  //横坐标int ordinate;  //纵坐标int direction; //方向
} SqStack;//储存路径(并置零)
int ChessBoard[Row + 1][Col + 1] = {}; //分别有(1 ~ 8)个方向
int HTry1[8] = {1, -1, -2, 2, 2, 1, -1, -2};
int HTry2[8] = {2, -2, 1, 1, -1, -2, 2, -1};SqStack PointStack[maxStep];
int top = -1; //栈顶int num = 0;         //记录结果数//棋盘打印方法
void printChessBoard()
{printf("棋盘路径是:\n");for (int i = 1; i <= Row; i++){for (int j = 1; j <= Col; j++){printf("%5d ", ChessBoard[i][j]);}printf("\n");}printf("\n\n");
}//入栈
void push(int abscissa, int ordinate)
{++top;PointStack[top].abscissa = abscissa;PointStack[top].ordinate = ordinate;PointStack[top].direction = -1; //初始化方向
}//出栈
void pop()
{PointStack[top].abscissa = 0;PointStack[top].ordinate = 0;PointStack[top].direction = -1; //初始化方向--top;
}//标记棋盘
//棋子的行走路径
void markChessBoard(int abscissa, int ordinate)
{ChessBoard[ordinate][abscissa] = top + 1;
}//初始化
//起点坐标
void InitStartPoint()
{int x, y;//输入起始坐标点printf("请输入起始点(x,y):");scanf("%d,%d", &x, &y);while (((x > Col || x <= 0) || (y > Row || y <= 0))){if ((x > Col || x <= 0) || (y > Row || y <= 0)){printf("输入的坐标超出范围,请重新输入(0~8):");scanf("%d,%d", &x, &y);}}//入首栈push(x, y);//标记路径markChessBoard(x, y);
}//主逻辑
void run()
{int xNow, yNow;//记录当前棋子位置while(1){//栈满if (top == maxStep - 1){break;}xNow = PointStack[top].abscissa;yNow = PointStack[top].ordinate;//检查该点可以走的所有节点得出最优解(少的先走)int count[8] = {};for (int i = 0; i < Row; i++){int xNext = xNow, yNext = yNow;xNext += HTry1[i];yNext += HTry2[i];if (xNext > 0 && xNext < Row && yNext > 0 && yNext < Col && ChessBoard[xNext][yNext] == 0){for (int j = 0; j < Col; j++){int xNext_Next = xNext, yNext_Next = yNext;xNext_Next += HTry1[j];yNext_Next += HTry2[j];if (xNext_Next > 0 && xNext_Next < Row && yNext_Next > 0 && yNext_Next < Col && ChessBoard[xNext_Next][yNext_Next] == 0){count[i]++;}                   }   }         }//对方向进行排序,实际要走的方向记录在directionNext中int directionNext[8] = {};int temp = 9;int k = 0;for (int i = 0; i < 8; i++){temp = 9;for (int j = 0; j < 8; j++){if (count[j] < temp){directionNext[i] = j;temp = count[j];k = j;}}count[k] = 9;}//走下一步int direnow = 0;for (direnow = PointStack[top].direction + 1; direnow < 8; direnow++){int xRealNext = xNow, yRealNext = yNow;xRealNext += HTry1[directionNext[direnow]];yRealNext += HTry2[directionNext[direnow]];PointStack[top].direction += 1;if (xRealNext <= Col && xRealNext > 0 && yRealNext <= Row && yRealNext > 0 && ChessBoard[yRealNext][xRealNext] == 0){push(xRealNext, yRealNext);markChessBoard(xRealNext, yRealNext);break;}}//判断无路可走出栈if (PointStack[top].direction >= 7){int x, y;x = PointStack[top].abscissa;y = PointStack[top].ordinate;ChessBoard[y][x] = 0; //棋盘标记取消pop();}}
}int main()
{InitStartPoint();clock_t start, finish;start = clock();//主逻辑run();finish = clock();printChessBoard();printf("运行用时:%f 秒!\n", (double)(finish - start) / CLOCKS_PER_SEC);
}

c语言数据结构之马踏棋盘相关推荐

  1. 数据结构与算法|马踏棋盘算法(小甲鱼)C语言代码的算法分析

    马踏棋盘算法(骑士周游问题)的算法分析 C语言代码部分来自小甲鱼的<数据结构与算法> 文章目录 马踏棋盘算法(骑士周游问题)的算法分析 一.C语言代码实现 二.代码分析与算法思路 题目要求 ...

  2. 数据结构——马踏棋盘题解(贪心算法)(C语言)

    数据结构--马踏棋盘题解(贪心算法) 使用循环建立棋盘与权值棋盘(权值为该位置可走的位置数量) 将当前步数写入棋盘数组中 开始探测下一步该走的位置, 分别测试八个方向 对可走位置进行查询权值,将权值最 ...

  3. 【大话数据结构C语言】43 图的应用 - 马踏棋盘算法

    欢迎关注我的公众号是[CodeAllen],关注回复[1024]获取资源 程序员技术交流①群:736386324 ,程序员技术交流②群:371394777 题目要求: 国际象棋的棋盘为8*8的方格棋盘 ...

  4. 数据结构——马踏棋盘题解(贪心算法)

    本文转自: https://blog.csdn.net/qq_41596568/article/details/83060317 数据结构--马踏棋盘题解(贪心算法) 使用循环建立棋盘与权值棋盘(权值 ...

  5. c语言马踏棋盘编程分析,C语言马踏棋盘实现

    原标题:C语言马踏棋盘实现 问题描述 国际象棋的棋盘为8×8的方格棋盘.现将"马"放在任意指定的方格中,按照"马"走棋的规则将"马"进行移动 ...

  6. 马踏棋盘---c语言

    问题描述: 国际象棋的棋盘为8x8的方格棋盘.现将"马"放在任意指定的方格中,按照"马"走棋的规则将"马"进行移动.要求每个方格只能进入一次 ...

  7. c语言字符马图案,C语言实现马踏棋盘

    //马踏棋盘主要要考虑三个因素: //第一:马走的位置用Move数组表示,以及棋盘的大小不再是8*8,而是12*12: //第二:只要找到马可以踏的下一个位置,就进行递归,只有一只进行递归,这是一种理 ...

  8. 马踏棋盘问题的程序c语言,C语言马踏棋盘

    问题描述 国际象棋的棋盘为8×8的方格棋盘.现将"马"放在任意指定的方格中,按照"马"走棋的规则将"马"进行移动.要求每个方格只能进入一次, ...

  9. Day600601.马踏棋盘算法 -数据结构和算法Java

    马踏棋盘算法 图的深度优先DFS 回溯 八皇后问题.小老鼠找迷宫问题 一.介绍 二.思路分析 三.代码实现 package com.achang.algorithm;import java.awt.* ...

最新文章

  1. easyexcel生成excel_阿里JAVA解析Excel工具easyexcel
  2. C++知识点杂记2——类成员指针、嵌套类和union
  3. 为什么面试你要35K,而HR只给你25K...
  4. Spring整合Hibernate和Struts2 (SSH)
  5. Spring security/Shiro ---登陆成功后返回登陆前界面<页面重定向>
  6. unicode编码 php,PHP 的 UNICODE 编码和解码
  7. 感染新冠后为啥会丧失​嗅觉?最新《细胞》论文终于搞明白了!
  8. linux getline函数用法,Linux文本处理三剑客之awk学习笔记05:getline用法详解
  9. 我的世界java232位_我的世界32位红石电脑RSC-3230(无命令方块)(2)
  10. [转载] python中callable_Python callable() 函数
  11. 关于DNF的多媒体包NPK文件的那些事儿(7) - IMGV5
  12. 用计算机怎样弄出告白密码,数字表白密码 表白密码大全
  13. 美国TJX公司 - MBA智库百科
  14. Python用socket、多线程实现一对一聊天室
  15. 国际知名制作公司名录及网址大全,制作人员必备
  16. 西湖大学鞠峰组招聘【塑料降解 / 污水工程 / 微生物学】方向博士后和科研助理...
  17. 请简述final、finalize和finally的区别
  18. 包头新松机器人_煤矿机器人现状及发展方向
  19. x265 码率控制算法(一)CQP
  20. 地下水监测系统介绍 地下水水位在线监测系统解决方案及应用

热门文章

  1. 网络型模块式柔性自动化生产线实验系统
  2. 解决方案指导------匹配(Matching)(2)
  3. 谱时图片直播2018维密大秀现场图片极速首发
  4. easyconnect xp登录_easyconnect怎么用?easyconnect电脑版使用方法介绍(含无法连接解决办法)...
  5. arm linux使用 usbmon 抓取usb总线数据包
  6. windows server 2019如何删除windows server backup备份的副本
  7. 【回放】5G小基站射频测试网络研讨会
  8. 2023百度强引百度蜘蛛方法(百度蜘蛛秒引工具)
  9. 为什么企业需要部署上网行为管理系统?
  10. 如何写优雅的代码(1)——灵活使用goto和__try:评论反馈