数据结构——马踏棋盘题解(贪心算法)
本文转自: https://blog.csdn.net/qq_41596568/article/details/83060317
数据结构——马踏棋盘题解(贪心算法)
- 使用循环建立棋盘与权值棋盘(权值为该位置可走的位置数量)
- 将当前步数写入棋盘数组中
- 开始探测下一步该走的位置, 分别测试八个方向
- 对可走位置进行查询权值,将权值最少的作为下一步的位置(每次都将步数最少的可走位置作为下一步的位置即贪心的体现)
- 循环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;
}
数据结构——马踏棋盘题解(贪心算法)相关推荐
- 数据结构——马踏棋盘题解(贪心算法)(C语言)
数据结构--马踏棋盘题解(贪心算法) 使用循环建立棋盘与权值棋盘(权值为该位置可走的位置数量) 将当前步数写入棋盘数组中 开始探测下一步该走的位置, 分别测试八个方向 对可走位置进行查询权值,将权值最 ...
- 马踏棋盘(回溯算法)
题目 在n*m的棋盘中,马只能走"日"字.马从位置(x,y)出发,把棋盘的每一格都走一次且只走一次.找出所有路径. 分析 马是在棋盘的点上行走的,所以这里的棋盘是指行有N条边.列有 ...
- 马踏中国象棋棋盘的贪心算法
今天上午在网上看到了一篇介绍马踏棋盘的贪心算法的文章,就想照着把它实现.可是写到一半,发现原文好像是国际象棋的棋盘.对国际象棋的规则一窍不通,所以就硬着头皮按中国象棋的规则来写.还真的写出来了. [问 ...
- 【数据结构与算法】马踏棋盘(骑士周游世界)算法
一,基本介绍 1)马踏棋盘算法也称为骑士周游问题 2)将马随机放在国际象棋的8 × 8棋盘Board[0~7] [0~7]的某个方格中,马按走棋规则(马走日字)进行移动.要求每个方格只进入一次,走遍棋 ...
- 骑士周游(马踏棋盘)问题
1,马踏棋盘算法介绍 马踏棋盘问题也被称为骑士周游问题 将马随机放在国际象棋的8*8的棋盘中的某个格子里,马按照走棋规则(日子)进行移动.要求每个方格只进入一次,走遍64个方格 2,马踏棋盘算法思路分 ...
- 用贪心算法解决马踏棋盘问题
用贪心算法解决马踏棋盘问题 参考文章: (1)用贪心算法解决马踏棋盘问题 (2)https://www.cnblogs.com/Allen-win/p/7095293.html 备忘一下.
- 残缺棋盘问题算法分析_javascript使用递归回溯算法和贪心算法解决马踏棋盘问题...
马踏棋盘算法介绍和游戏演示 1.马踏棋盘算法也被称为骑士周游问题 2.将马随机放在国际象棋的8×8棋盘Board[0-7][0-7]的某个方格中,马按走棋规则(马走日字)进行移动.要求每个方格只进入一 ...
- java 马踏棋盘优化_我所知道的十大常用算法之马踏棋盘算法(深度搜索、贪心思想优化 )...
前言需求 今天我们学习的是马踏棋盘算法,我们还是从一个场景里引入看看 马踏棋盘算法也被称为骑士周游问题 将马随机放在国际象棋的6×6棋盘Board0-5的某个方格中 提示:马按走棋规则(马走日字)进行 ...
- 数据结构与算法|马踏棋盘算法(小甲鱼)C语言代码的算法分析
马踏棋盘算法(骑士周游问题)的算法分析 C语言代码部分来自小甲鱼的<数据结构与算法> 文章目录 马踏棋盘算法(骑士周游问题)的算法分析 一.C语言代码实现 二.代码分析与算法思路 题目要求 ...
最新文章
- OpenCV-Java版学习(3.对视频的基本操作)
- SparkR:数据科学家的新利器
- mysql binlo 抽取_使用mysqlbinlog根据时间点提取SQL简单方法
- Android USB转串口编程
- linux重定向命令是干嘛的,Linux系统下重定向命令应用及其语法有什么?
- Centos 6安装完美搭建mysql、php、apache之旅
- 怎么查江苏省计算机一级成绩,江苏省计算机一级查询成绩在哪里查-江苏省计算机一级查询成绩查询网址-常州宝...
- java createcell_CreateCell
- 2021年全球与中国汽车TSR(交通标志识别)系统行业市场规模及发展前景分析
- 安卓flash插件_谷歌Chrome 76稳定版正式发布:默认禁用Flash
- 德勤,普华永道,安永,毕马威这四大会计师事务所,有什么区别
- 测试从零开始-No.9-软件配置管理介绍
- 联想笔记本电脑重装系统按F几
- Java 深入面向对象
- pytorch指定版本更新
- 高校最美图书馆!飘在水上?
- 计算机函数vlookup套用,vlookup函数应用实例(一)
- 淄博市计算机培训动画制作,网页制作与电脑动画制作培训
- 2021爱智先行者—最全硬件入手体验及介绍
- HTML5 (五) 表格的使用