算法报告五 跳马问题

                                                               16122020   钟顺源

一、题目大意

给定8*8方格棋盘,求棋盘上一只马从一个位置到达另一位置的最短路径长
注意马是走“日”形的。

二、分析

这是一道显然的搜索题,用dfs或bfs均可,但bfs更加简单,广搜更加容易理解。
某一点的到起点的最短距离一定是从某一个合法位置跳到这个点的,从起点bfs,如果设当前的点是u,能到达的点是v,那么v到起点的最短距离=u到起点的最短距离+1(u到v的距离)
那么对于一个u 有哪几个v呢?

v v
v v
u
v v
v v

如上表,有八个方向,记录一下两维的偏移量。
使用一个vis数组,记录这个点访问过了没。
具体操作而言,从某起点出发,对每个点广度搜索,若这个点访问过了,则跳过这个点,否则搜索它可以到达的所有点,更新vis数组,更新到起点需要几步,入队列,重复操作,知道,队列为空。
这题基本就是这样做的,但数据量较少,我直接暴力枚举所有起点,求这个起点,到所有点的跳动次数。

三、代码

#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
bool vis[9][9];
int dis[9][9][9][9];
typedef pair<int,int> PII;
#define X first
#define Y second
#define clr(x,y) memset(x,0,sizeof(x) )
int dx[]={1,-1,1,-1,2,-2,2,-2};
int dy[]={2,2,-2,-2,1,1,-1,-1};void bfs(int x,int y){clr(vis,0);clr(dis[x][y],INF);dis[x][y][x][y]=0;queue<PII> q;q.push(PII(x,y));while(!q.empty()){PII cur=q.front();q.pop();int xx=cur.X,yy=cur.Y;for(int i=0;i<8;i++){int xxx=dx[i]+xx,yyy=dy[i]+yy;if(xxx<0||xxx>8||yyy<0||yyy>8||vis[xxx][yyy]) continue;vis[xxx][yyy]=1;dis[x][y][xxx][yyy] = dis[x][y][xx][yy] + 1;q.push(PII(xxx,yyy));}}
}
char from[5],to[5];
int main()
{for(int i=1;i<=8;i++)for(int j=1;j<=8;j++)bfs(i,j);while(~scanf("%s %s",from,to)){int x=from[0]-'a'+1;int y=from[1]-'0';int xx=to[0]-'a'+1;int yy=to[1]-'0';printf("%s==>%s: %d moves\n",from,to,dis[x][y][xx][yy]);}return 0;
}

四、体会

    这次是一个基础的bfs,与一些迷宫问题或是在方格上求最短距离不同,它有八个方向,然而本质是不变的,都是记录访问状态vis和离起点最短距离,当然全部暴力用bfs打表出来在数据量大的时候肯定不行,到时候可能要对一个个询问依次处理,要用到更高效的搜索,比如双向bfs,或者启发式搜索。

算法报告五--跳马问题相关推荐

  1. 计算机组成原理实验load,计算机组成原理实验报告五

    计算机组成原理实验报告五 (5页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 4.9 积分 广东工业大学广东工业大学实验报告 计算机学院 计算机科学与技术 ...

  2. c语言实验报告5数组,c语言实验报告五一维数组.doc

    c语言实验报告五一维数组 <C程序设计>课程实验报告 学院: 班级: 姓名: 学号: 实验设备:计算机1台2011年3月1日 实验项目名称一维数组 掌握一维数组的定义.初始化,以及一维数组 ...

  3. 基于Matlab的跨孔CT胖射线追踪算法(五)

    基于Matlab的跨孔CT胖射线追踪算法(五) CT技术是一种无损的工程物探检测技术,因其方法简单.分辨率高.理论上更可靠.结果更直观,被广泛的应用于各种工程.胖射线追踪是CT技术的一种正演算法,本文 ...

  4. 聚类算法(五)——层次聚类 linkage (含代码)

    聚类算法相关: 聚类算法(一)--DBSCAN 聚类算法(二)-- 优缺点对比 聚类算法(三)-- 评测方法1 聚类算法(三)-- 评测方法2 聚类算法(三)-- 评测方法3(代码) 聚类算法(四)- ...

  5. 数据结构和算法(五)--栈(Stack)

    数据结构和算法(五)–栈(Stack) 什么是栈 栈是一种特殊的线性表,只能在一端进行操作 往栈中添加元素,一般叫做push,入栈 往栈中移除元素,一般叫做pop,弹栈/出栈(只能移除栈顶元素) 栈遵 ...

  6. 在一个程序中什么算是亮点_算法的五个重要特性是

    算法的五个特征是?如题 1.有穷性: 一个算法必须保证执行有限步之后结束: 2.确切性: 算法的每一步骤必须有确切的定义: 3.输入:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是 ...

  7. 现代优化算法(五): 蚁群算法

    组合优化算法系列: 现代优化算法 (一):模拟退火算法 及应用举例 现代优化算法 (二): 遗传算法 及应用举例 现代优化算法(三):禁忌搜索算法 现代优化算法(四):改进的遗传算法 现代优化算法(五 ...

  8. 算法:五笔编码,如何根据输入的词条自动生成输入编码

    算法:五笔编码,如何根据输入的词条自动生成输入编码 一.想要实现的 最近做的一个五笔码表工具,想要实现根据用户输入的词条自动生成输入编码. 比如: 输入 我们 生成 trwu 输入 五笔基础知识 生成 ...

  9. 算法的五个重要特性和4个基本标准

    算法的五个重要特性和4个基本标准 一个算法必须满足5大特性: 1.有穷性:一个算法必须执行有穷步后结束. 2.确定性:对于每种情况下所应执行的操作,在算法中都应该有确切的规定,不会产生二义性,使得算法 ...

最新文章

  1. greenplum安装札记(待完善)
  2. openstack(Queens版) 安装FWaaS
  3. 初学Java Web(5)——cookie-session学习
  4. usleep延时0.毫秒_LabVIEW从0到1系列视频培训_第4讲全集_操作例程说明
  5. 电脑看不到光驱盘符,应该如何解决
  6. java正则表达式 匹配()_学习Java正则表达式(匹配、替换、查找)
  7. NodeBlog v0.1.0发布
  8. MySQL 传统复制中常见故障处理和结构优化案例分析
  9. linux内存管理之malloc
  10. ubuntu 安装 man 查看函数原型
  11. 把图片url 伪静态 php,php url伪静态化的实现方法详解
  12. R 实战学生成绩描述分析
  13. 《生与死》(瓦特·兰德)
  14. 灰度发布:灰度很简单,发布很复杂
  15. 三分钟快速了解怎么查询ip地址,怎么更换ip地址!
  16. 浏览器被hao123劫持首页处理
  17. Flask蓝本创建名称错误导致的werkzeug.routing.BuildError
  18. conda 配置R虚拟环境并安装 monocle 包
  19. ENVI 混合像元分解
  20. 查找OpenJDK安装路径

热门文章

  1. ebay html 如何编辑,ebay:批量编辑Brand和MPN的步骤
  2. 股票——指数移动平均线
  3. 爬虫获取西刺免费高匿代理
  4. XXL-Job动态添加任务
  5. 新农慕课python答案第八周_2021年智慧树Python语言应用第五单元章节测试答案选修课网课慕课答案...
  6. 中国化合物半导体产业竞争趋势与投资前景建议报告2022-2028年版
  7. 修订版开源项目成功的十条准则
  8. 2009年数学建模B题
  9. 计量经济学及Stata应用 第四章习题
  10. 应届毕业生程序员在面试时如何做好自我介绍?