象棋马走日全球变暖——(bfs例题)
1.bfs马走日思路导图
相信大家都了解象棋中马的走法,如图所示(在不考虑拌马蹄的情况下);
2.bfs宽度搜索思想
- 与常规bfs相比,走象棋的主要不同点就是方向从4个变成了8个;
- 其他的和bfs模板极其相似,如下所示。
- bfs它在搜索中并不理会目标在哪里,只会按照自己题目中给定的方向去朝向扩散;
- 因为要一层一层搜索,先进来的点先搜索,后进来的点后搜索,和队列的特征很符合,因此一般用队列进行解决;
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例题)相关推荐
- 最少步数问题(BFS马走日)
描述 在各种棋中,棋子的走法总是一定的,如中国象棋中马走"日".有一位小学生就想如果马能有两种走法将增加其趣味性,因此,他规定马既能按"日"走,也能如象一样走& ...
- 马走日 java实现
马走日 问题描述: 在中国象棋里,马的走棋要遵循"马走日"的规则,在本题中,给定马的起始位置,以及一个目标位置,判定该马是否能够走到该位置,如果能走到,最少步数是多少.(假设棋盘上 ...
- [计蒜客]马走日-c++
hi!大家好: 最近几天看了问答,发现有一些人在刷采纳,我就不说是谁了,建议官方处理一下: 好了,回到正题,最近几天,有个朋友问我了很多BFS的题 我打着打着就有点蒙,难的题对了,简单的题错了...就 ...
- 东华码蹄集第21周oj赛(光潮的幻像,分苹果,马走日,码哥猜想)
小码哥在雪山闲逛的时候发现了一个神秘的序列.他发现如果按照一定的方式对这个序列进行操作,就可以得到一些隐藏的线索.这个序列含有n个整数,你需要对其进行m 次操作,操作分为两种: 1.给出下标α和整数y ...
- 信息学奥赛一本通(1219:马走日)
1219:马走日 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 12078 通过数: 6316 [题目描述] 马在中国象棋以日字形规则移动. 请编写一段程 ...
- 马走日程序Java_马走日什么意思
中国象棋在中国有着三千多年的历史,在中国古代,象棋被列为士大夫们的修身之艺,属于琴棋书画四艺之一.现在则被视为是怡神益智的一种有益身心的活动. 中国象棋是由两人轮流走子,以"将死" ...
- Bailian4123 马走日【DFS】
4123:马走日 总时间限制: 1000ms 内存限制: 1024kB 描述 马在中国象棋以日字形规则移动. 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的 ...
- GDUT - 专题学习1 C - 马走日
C - 马走日 题目 马在中国象棋以日字形规则移动. 请编写一段程序,给定 n×m 大小的棋盘,以及马的初始位置 (x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. ...
- 马走日(DFS深搜)
马走日 目录 马走日 题意描述:给多组数据,给棋盘的大小和马的初始位置,求有多少种方法让马走日全部走过棋盘,不能重复走棋盘的同一个点 解题思路:利用数组来对所有的棋盘上所有的点初始化表示未走过,把马的 ...
- 马走日的解法(dfs)
马在中国象棋以日字形规则移动. 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. Input 第一行为整数T ...
最新文章
- information_schema.triggers 学习
- SQL 创建索引的作用以及如何创建索引
- Pavel and Triangles(贪心)
- boost::execution_monitor相关的测试程序
- 老李分享:基于图像识别的跨平台的手机自动化测试方案
- 经典数学书目、各数学分支入门清单
- jdk的安装(redhat)
- Luogu3390 【模板】矩阵快速幂
- 根据表达式序列(前缀、中缀、后缀)构建表达式树
- flutter dart 中dynamic var object的区别
- Windows安全配置技术(转)
- swift 时间选择器第三方。公历转农历,农历转公历。
- 使用 mesh 实现多边形裁剪图片!Cocos Creator!
- 批量图像自动分割 grabcut+阈值分割 opencv
- java的login_Java login登陆界面设计
- sql语法:详解DDL
- 使用jQuery重置(reset)表单的方法
- Excel如何将数据拆分开
- 淘宝/天猫API ,获取sku详细信息 OneBound数据
- linux下查找某文件/文件夹所在的位置
热门文章
- 微信对账单 java_[Java]获取微信api中的下载对账单和下载资金账单功能
- html css的参考文献,网页制作论文参考文献大全 网页制作参考文献有哪些
- 第1天学习打卡(Javaweb 邮件发送:原理、发送简单文本邮件、发送带图片和附件邮件、网站注册发送邮件Servlet实现)
- 视觉惯性里程计 综述 VIO Visual Inertial Odometry msckf ROVIO ssf msf okvis ORB-VINS VINS-Mono gtsam
- 宿舍校园网路由器配置原理及指南
- python怎么输出roc曲线_如何用Python绘制ROC曲线
- 扑克牌游戏----花色从大到小按黑桃(Spade)、红桃(Heart)、梅花(Club)、方块(Diamond)排列
- 抖音直播如何快速提升人气热度,让客户下单。
- 字节跳动员工基本年薪曝光:最高 254 万元
- php水印文字方向,ppt文本框文字方向为所有文字旋转的设置方法