本文转自: https://blog.csdn.net/qq_41596568/article/details/83060317

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

  1. 使用循环建立棋盘与权值棋盘(权值为该位置可走的位置数量)
  2. 将当前步数写入棋盘数组中
  3. 开始探测下一步该走的位置, 分别测试八个方向
  4. 对可走位置进行查询权值,将权值最少的作为下一步的位置(每次都将步数最少的可走位置作为下一步的位置即贪心的体现)
  5. 循环2~4。
//马踏棋盘---贪心题解
#include<stdio.h>
#include<stdlib.h>#define OK      1
#define TRUE    1
#define ERROR   0
#define FALSE   0#define M 8
#define N 8int direction[2][9]={{0,-2,-1,1,2,2,1,-1,-2},{0,1,2,2,1,-1,-2,-2,-1}};       //增量数组
int pow[M][N];
int check[M][N],next[M][N];         //创建棋盘,初始为0
struct Element //数据域
{int x,y; //x行,y列int d; //下一步的方向
};
typedef struct LStack //链栈
{Element data;struct LStack *next;
}*PLStack;typedef struct check //定义棋盘内点的坐标
{int x; int y;
}Check;   /*************栈函数****************/
int InitStack(PLStack &S)//构造空栈
{S=NULL;return OK;
}
int StackEmpty(PLStack S)//判断栈是否为空
{if(S==NULL)return OK;elsereturn FALSE;
}
int Push(PLStack &S, Element e)//元素入栈
{PLStack p;p=(PLStack)malloc(sizeof(LStack));p->data=e;p->next=S;S=p;return OK;
}
int Pop(PLStack &S,Element &e) //元素出栈
{PLStack p;if(!StackEmpty(S)){e=S->data;p=S;S=S->next;free(p);return OK;}elsereturn FALSE;
}/********贪心权值函数********/void Printf(int p[M][N]){          //打印权值数组 for(int i=0;i<M;i++){for(int j=0;j<N;j++)printf(" %2d ",p[i][j]);printf("\n");}
}
void InitWeight(){    //创建权值数组并初始化每个位置的权值 for(int i=0;i<M;i++)for(int j=0;j<N;j++)pow[i][j]=0;for(int i=0;i<M;i++){for(int j=0;j<N;j++){for(int dir=1;dir<=8;dir++){int x1=i+direction[0][dir];int y1=j+direction[1][dir];if(x1>=0&&x1<=7&&y1>=0&&y1<=7)pow[i][j]++;}             } }
}void SetWeight(int x,int y) {   //位置(x,y)设置为  被占用  时,修改权值数组 ,被占用时为9 pow[x][y]=9;for(int dir=1;dir<=8;dir++){int x1=x+direction[0][dir];int y1=y+direction[1][dir];if(x1>=0&&x1<=7&&y1>=0&&y1<=7&&pow[x1][y1]!=9)pow[x1][y1]--;}}void UnSetWeight(int x,int y){  //位置(x,y)设置为  未占用  时,修改权值数组for(int dir=1;dir<=8;dir++){int x1=x+direction[0][dir];int y1=y+direction[1][dir];if(x1>=0&&x1<=7&&y1>=0&&y1<=7&&pow[x1][y1]!=9){pow[x1][y1]++;pow[x][y]++;}}
}/*******马踏棋盘函数*******/
int Step(Check start,PLStack &H) {Element data;int x=start.x-1,y=start.y-1;//将输入位置建议,数组从0,0开始存储 int i=1;while(i<=64){check[x][y]=i;     //将当前步数写入棋盘数组SetWeight(x,y);struct Element t,data;int pow_min=9;for(int dir=1;dir<=8;dir++){     //探测下一步可走的方向 int x1=x+direction[0][dir];int y1=y+direction[1][dir];if(x1>=0&&x1<=7&&y1>=0&&y1<=7&&pow[x1][y1]!=9){if(pow_min>pow[x1][y1])       //找出下一步位置中权值最小的 {pow_min=pow[x1][y1];t.d=dir;  //上一步的方向 t.x=x1;t.y=y1;}}}data.x=x;    //入栈 data.y=y;data.d=t.d;Push(H,data);x=t.x;        //坐标更新 y=t.y;i++;         //步数增加 }return OK;
}int main(){for(int i=0;i<M;i++) {         //棋盘初始化 for(int j=0;j<N;j++){check[i][j]=0;       //棋盘 next[i][j]=0;     //轨迹棋盘 }}        InitWeight();     //建立权值棋盘 PLStack H;InitStack(H);   //构造空栈HCheck start;printf("请输入起始坐标x y:");scanf("%d%d",&start.x,&start.y); Step(start,H);Printf(check); return 0;
}

数据结构——马踏棋盘题解(贪心算法)相关推荐

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

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

  2. 马踏棋盘(回溯算法)

    题目 在n*m的棋盘中,马只能走"日"字.马从位置(x,y)出发,把棋盘的每一格都走一次且只走一次.找出所有路径. 分析 马是在棋盘的点上行走的,所以这里的棋盘是指行有N条边.列有 ...

  3. 马踏中国象棋棋盘的贪心算法

    今天上午在网上看到了一篇介绍马踏棋盘的贪心算法的文章,就想照着把它实现.可是写到一半,发现原文好像是国际象棋的棋盘.对国际象棋的规则一窍不通,所以就硬着头皮按中国象棋的规则来写.还真的写出来了. [问 ...

  4. 【数据结构与算法】马踏棋盘(骑士周游世界)算法

    一,基本介绍 1)马踏棋盘算法也称为骑士周游问题 2)将马随机放在国际象棋的8 × 8棋盘Board[0~7] [0~7]的某个方格中,马按走棋规则(马走日字)进行移动.要求每个方格只进入一次,走遍棋 ...

  5. 骑士周游(马踏棋盘)问题

    1,马踏棋盘算法介绍 马踏棋盘问题也被称为骑士周游问题 将马随机放在国际象棋的8*8的棋盘中的某个格子里,马按照走棋规则(日子)进行移动.要求每个方格只进入一次,走遍64个方格 2,马踏棋盘算法思路分 ...

  6. 用贪心算法解决马踏棋盘问题

    用贪心算法解决马踏棋盘问题 参考文章: (1)用贪心算法解决马踏棋盘问题 (2)https://www.cnblogs.com/Allen-win/p/7095293.html 备忘一下.

  7. 残缺棋盘问题算法分析_javascript使用递归回溯算法和贪心算法解决马踏棋盘问题...

    马踏棋盘算法介绍和游戏演示 1.马踏棋盘算法也被称为骑士周游问题 2.将马随机放在国际象棋的8×8棋盘Board[0-7][0-7]的某个方格中,马按走棋规则(马走日字)进行移动.要求每个方格只进入一 ...

  8. java 马踏棋盘优化_我所知道的十大常用算法之马踏棋盘算法(深度搜索、贪心思想优化 )...

    前言需求 今天我们学习的是马踏棋盘算法,我们还是从一个场景里引入看看 马踏棋盘算法也被称为骑士周游问题 将马随机放在国际象棋的6×6棋盘Board0-5的某个方格中 提示:马按走棋规则(马走日字)进行 ...

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

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

最新文章

  1. OpenCV-Java版学习(3.对视频的基本操作)
  2. SparkR:数据科学家的新利器
  3. mysql binlo 抽取_使用mysqlbinlog根据时间点提取SQL简单方法
  4. Android USB转串口编程
  5. linux重定向命令是干嘛的,Linux系统下重定向命令应用及其语法有什么?
  6. Centos 6安装完美搭建mysql、php、apache之旅
  7. 怎么查江苏省计算机一级成绩,江苏省计算机一级查询成绩在哪里查-江苏省计算机一级查询成绩查询网址-常州宝...
  8. java createcell_CreateCell
  9. 2021年全球与中国汽车TSR(交通标志识别)系统行业市场规模及发展前景分析
  10. 安卓flash插件_谷歌Chrome 76稳定版正式发布:默认禁用Flash
  11. 德勤,普华永道,安永,毕马威这四大会计师事务所,有什么区别
  12. 测试从零开始-No.9-软件配置管理介绍
  13. 联想笔记本电脑重装系统按F几
  14. Java 深入面向对象
  15. pytorch指定版本更新
  16. 高校最美图书馆!飘在水上?
  17. 计算机函数vlookup套用,vlookup函数应用实例(一)
  18. 淄博市计算机培训动画制作,网页制作与电脑动画制作培训
  19. 2021爱智先行者—最全硬件入手体验及介绍
  20. HTML5 (五) 表格的使用

热门文章

  1. 一批美国名校被曝监控学生:14秒记录一次手机位置,想翘课更难了
  2. 特斯拉前员工承认备份AutoPilot代码,但入职小鹏汽车前已删除
  3. Vue面试中经常会被问到的面试题
  4. oracle exp/imp命令详解
  5. Android程序反编译
  6. [示例]创建Student类,输入学生信息并存入字典,将3个存有学生信息的字典存入数组,并计算...
  7. Android图片处理
  8. Android 截屏并写入SD卡中
  9. Eclipse调试Debug技巧
  10. linux开机启动脚本的顺序