1.bfs马走日思路导图

相信大家都了解象棋中马的走法,如图所示(在不考虑拌马蹄的情况下);

2.bfs宽度搜索思想

  • 与常规bfs相比,走象棋的主要不同点就是方向从4个变成了8个;
  • 其他的和bfs模板极其相似,如下所示。
  1. bfs它在搜索中并不理会目标在哪里,只会按照自己题目中给定的方向去朝向扩散;
  2. 因为要一层一层搜索,先进来的点先搜索,后进来的点后搜索,和队列的特征很符合,因此一般用队列进行解决;

3.主旨展现

  • 首先d[N][N]初始化为 - 1,然后d[x][y]入队,进行bfs循环,行走固定位置;
  • 然后用d[N][N]来储存能到走“车”的最短步数
  • 最后输出最小步数;

4.例题(1)来喽——马走日

题目描述

Raksasa非常喜欢下棋,同时充满好奇心。有一天在下棋的时候,Raksasa突然想到一个问题。
在一个n∗m的棋盘上,马处于棋盘上一个位置,車处于另外q个位置(所有棋子的位置均不相同)。假如这个車,爆胎了(不能移动)。马最少需要几步才能踩掉这个車,或者踩不到。
请你棒Raksasa想出这个问题的答案,如果能踩到,输出最少次数,否则输出"−1"。
本题将给出q次询问,马的位置恒定不变。

输入格式

第一行为三个整数n,m,q(1≤n,m≤1000)n表示棋盘的行数,m表示棋盘的列数,q表示询问次数。
第二行为两个整数x(1≤x≤n),y(1≤y≤m),x表示马所处的行数,y表示马所处的列数。
接下来的q行,每行为两个整数posx(1≤posx≤n)(1≤posy≤m)posx表示车所处的行数,posy表示车所处的列数。

输出格式

输出q行,每行输出一个整数,为最小查询次数或者-1;

样例输入

5 9 1
3 5
5 9

结果输出

2
#include<bits/stdc++.h>using namespace std;typedef pair<int, int>PII;//定义队列
queue<PII>q;
const int N = 1010;
int n, m, l;
int d[N][N];
int dx[8] = { -2,-2,-1,-1,1,1,2,2 };
int dy[8] = { 1,-1,2,-2,2,-2,1,-1 }; //8个位置void bfs()
{while (q.size()){PII t = q.front();q.pop();int x = t.first, y = t.second;for (int i = 0; i < 8; i++){int tx = x + dx[i];int ty = y + dy[i];if (d[tx][ty] != -1 || tx <= 0 || ty <= 0 || tx > n || ty > m) continue;else{d[tx][ty] = d[x][y] + 1;//步数加1q.push({ tx,ty });}}}
}
int main()
{cin >> n >> m >> l;int a, b;cin >> a >> b;memset(d, -1, sizeof d);//初始化为-1d[a][b] = 0;q.push({ a,b });bfs();while (l--){int x, y;cin >> x >> y;cout << d[x][y] << endl;}
}

5.例题(2)来喽——全球变暖(icpc)

问题描述

你有一张某海域 N x N 像素的照片,. 表示海洋、# 表示陆地,如下所示:

. . . .  . . .
. # # . . . .
. # # . . . .
. . . . # # .
. . # # # # .
. . . # # # .
. . . . . . .

其中 “上下左右” 四个方向上连在一起的一片陆地组成一座岛屿,例如上图就有 2 座岛屿。

由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。

具体来说如果一块陆地像素与海洋相邻 (上下左右四个相邻像素中有海洋),它就会被淹没。

例如上图中的海域未来会变成如下样子:

. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. .  . . # . .
. . . . . . .
. . . . . . . 

输入格式
第一行包含一个整数 N,以下 N 行 N 列代表一张海域照片;

照片保证第 1 行、第 1 列、第 N 行、第 N 列的像素都是海洋;

输出格式
一个整数表示答案;

样例(1)输入:

7
. . . .  . . .
. # # . . . .
. # # . . . .
. . . . # # .
. . # # # # .
. . . # # # .
. . . . . . .

输出结果:

1

样例(2)输入:

11
...........
.##........
.##........
....##.#...
..#######..
...###.#...
...........
..#....#...
......###..
.......#...
...........

结果输出:

2
#include<bits/stdc++.h>using namespace std;typedef pair<int, int>PII;//定义队列
const int N = 111;
int flag[N][N];//标记岛屿是否进行遍历过
char g[N][N];
int n;
int dx[4] = { -1,0,1,0 };
int dy[4] = { 0,1,0,-1 };//用来枚举方向int bfs(int x, int y)
{int s = 0;queue<PII>q;q.push({ x,y });while (q.size()){int c = 0;PII t = q.front();q.pop();for (int i = 0; i < 4; i++){int tx = t.first + dx[i], ty = t.second + dy[i];if (tx < 0 || ty < 0 || tx >= n || ty >= n) continue;if (g[tx][ty] == '#')//找到岛屿判断上下左右是否满足情况{c++;//每满足一种情况进行加1if (flag[tx][ty] == 0)//判断是否遍历过{q.push({ tx,ty });flag[tx][ty] = 1;//标记遍历过的岛屿}}}if (c == 4) s++;//如果满足四种情况(上下左右),就是不沉默的岛屿}return s;
}
int main()
{int k = 0;//记录沉没个数cin >> n;for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){cin >> g[i][j];}}for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){if (g[i][j] == '#' && flag[i][j] == 0)if (bfs(i, j) == 0) k++;//经过搜索之后输出0则是沉没,再进行求和}}printf("%d", k);return 0;
}

象棋马走日全球变暖——(bfs例题)相关推荐

  1. 最少步数问题(BFS马走日)

    描述 在各种棋中,棋子的走法总是一定的,如中国象棋中马走"日".有一位小学生就想如果马能有两种走法将增加其趣味性,因此,他规定马既能按"日"走,也能如象一样走& ...

  2. 马走日 java实现

    马走日 问题描述: 在中国象棋里,马的走棋要遵循"马走日"的规则,在本题中,给定马的起始位置,以及一个目标位置,判定该马是否能够走到该位置,如果能走到,最少步数是多少.(假设棋盘上 ...

  3. [计蒜客]马走日-c++

    hi!大家好: 最近几天看了问答,发现有一些人在刷采纳,我就不说是谁了,建议官方处理一下: 好了,回到正题,最近几天,有个朋友问我了很多BFS的题 我打着打着就有点蒙,难的题对了,简单的题错了...就 ...

  4. 东华码蹄集第21周oj赛(光潮的幻像,分苹果,马走日,码哥猜想)

    小码哥在雪山闲逛的时候发现了一个神秘的序列.他发现如果按照一定的方式对这个序列进行操作,就可以得到一些隐藏的线索.这个序列含有n个整数,你需要对其进行m 次操作,操作分为两种: 1.给出下标α和整数y ...

  5. 信息学奥赛一本通(1219:马走日)

    1219:马走日 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 12078     通过数: 6316 [题目描述] 马在中国象棋以日字形规则移动. 请编写一段程 ...

  6. 马走日程序Java_马走日什么意思

    中国象棋在中国有着三千多年的历史,在中国古代,象棋被列为士大夫们的修身之艺,属于琴棋书画四艺之一.现在则被视为是怡神益智的一种有益身心的活动. 中国象棋是由两人轮流走子,以"将死" ...

  7. Bailian4123 马走日【DFS】

    4123:马走日 总时间限制: 1000ms 内存限制: 1024kB 描述 马在中国象棋以日字形规则移动. 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的 ...

  8. GDUT - 专题学习1 C - 马走日

    C - 马走日 题目 马在中国象棋以日字形规则移动. 请编写一段程序,给定 n×m 大小的棋盘,以及马的初始位置 (x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. ...

  9. 马走日(DFS深搜)

    马走日 目录 马走日 题意描述:给多组数据,给棋盘的大小和马的初始位置,求有多少种方法让马走日全部走过棋盘,不能重复走棋盘的同一个点 解题思路:利用数组来对所有的棋盘上所有的点初始化表示未走过,把马的 ...

  10. 马走日的解法(dfs)

    马在中国象棋以日字形规则移动. 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. Input 第一行为整数T ...

最新文章

  1. information_schema.triggers 学习
  2. SQL 创建索引的作用以及如何创建索引
  3. Pavel and Triangles(贪心)
  4. boost::execution_monitor相关的测试程序
  5. 老李分享:基于图像识别的跨平台的手机自动化测试方案
  6. 经典数学书目、各数学分支入门清单
  7. jdk的安装(redhat)
  8. Luogu3390 【模板】矩阵快速幂
  9. 根据表达式序列(前缀、中缀、后缀)构建表达式树
  10. flutter dart 中dynamic var object的区别
  11. Windows安全配置技术(转)
  12. swift 时间选择器第三方。公历转农历,农历转公历。
  13. 使用 mesh 实现多边形裁剪图片!Cocos Creator!
  14. 批量图像自动分割 grabcut+阈值分割 opencv
  15. java的login_Java login登陆界面设计
  16. sql语法:详解DDL
  17. 使用jQuery重置(reset)表单的方法
  18. Excel如何将数据拆分开
  19. 淘宝/天猫API ,获取sku详细信息 OneBound数据
  20. linux下查找某文件/文件夹所在的位置

热门文章

  1. 微信对账单 java_[Java]获取微信api中的下载对账单和下载资金账单功能
  2. html css的参考文献,网页制作论文参考文献大全 网页制作参考文献有哪些
  3. 第1天学习打卡(Javaweb 邮件发送:原理、发送简单文本邮件、发送带图片和附件邮件、网站注册发送邮件Servlet实现)
  4. 视觉惯性里程计 综述 VIO Visual Inertial Odometry msckf ROVIO ssf msf okvis ORB-VINS VINS-Mono gtsam
  5. 宿舍校园网路由器配置原理及指南
  6. python怎么输出roc曲线_如何用Python绘制ROC曲线
  7. 扑克牌游戏----花色从大到小按黑桃(Spade)、红桃(Heart)、梅花(Club)、方块(Diamond)排列
  8. 抖音直播如何快速提升人气热度,让客户下单。
  9. 字节跳动员工基本年薪曝光:最高 254 万元
  10. php水印文字方向,ppt文本框文字方向为所有文字旋转的设置方法