4.6模拟 宽度优先搜索

总结

bfs除了代码能力没有任何算法。。。
有些细节是值得注意的

T1 面积(area)

在这里插入图片描述bfs被我写成了dfs。。。
(不过我觉得这么写挺不戳)
核心思路就是用一个flag记录当前跑得这些点有没有效
恶心之处在于本题默认m=n=10!!!

代码

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#define ll long long
using namespace std;
const int N=1e6+100;
int m,n;
int mp[1001][1001],jd[1001][1001];
int flag=1;
int xx[5]={0,0,0,1,-1},yy[5]={0,1,-1,0,0};
int dfs(int x,int y){if(jd[x][y]) return 0;if(x<1||x>n||y<1||y>m){flag=0;return 0;}if(mp[x][y]) return 0;jd[x][y]=1;int ans=1;for(int i=1;i<=4;i++) ans+=dfs(x+xx[i],y+yy[i]);if(flag) return ans;else return 0;
}
int main(){n=10;m=10;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++) scanf("%d",&mp[i][j]);}int tot=0;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){flag=1;tot+=dfs(i,j);}}printf("%d",tot);
}
/*
10 10
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 1 1 1 0 0 0 
0 0 0 0 1 0 0 1 0 0 
0 0 0 0 0 1 0 0 1 0 
0 0 1 0 0 0 1 0 1 0 
0 1 0 1 0 1 0 0 1 0 
0 1 0 0 1 1 0 1 1 0 
0 0 1 0 0 0 0 1 0 0 
0 0 0 1 1 1 1 1 0 0 
0 0 0 0 0 0 0 0 0 04 6
0 1 1 0 1 0
1 0 1 1 0 1
0 1 0 0 1 0 
0 0 1 1 0 0
*/

T2 营救

在这里插入图片描述
too water too say anything…
(就是简单的宽搜)

代码

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<queue>
#define ll long long
using namespace std;
const int N=1e6+100;
int m,n;
int xx0,yy0,X,Y;
int mp[1010][1010],jd[1010][1010];
int flag=1;
int xx[5]={0,0,0,1,-1},yy[5]={0,1,-1,0,0};
struct node{int x,y,step;
};
void bfs(){queue<node>q;q.push((node){xx0,yy0,0});while(!q.empty()){node o=q.front();q.pop();if(o.x==X&&o.y==Y){printf("%d",o.step);return;}for(int i=1;i<=4;i++){int nx=o.x+xx[i],ny=o.y+yy[i];if(mp[nx][ny]||jd[nx][ny]||nx<1||nx>n||ny<1||ny>n)continue;jd[nx][ny]=1;q.push((node){nx,ny,o.step+1}); }}return;
}
int main(){scanf("%d",&n);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++) scanf("%1d",&mp[i][j]);}scanf("%d%d%d%d",&xx0,&yy0,&X,&Y);bfs();
}
/*
3
001
101
100
1 1 2 24 6
0 1 1 0 1 0
1 0 1 1 0 1
0 1 0 0 1 0 
0 0 1 1 0 0
*/

T3 最少转弯问题(turn)

在这里插入图片描述
代码也与上一题类似
只是把每次尝试入队的元素改成一整排就行了
注意:只走一行的话应该算0次转弯,所以初始入队元素要从-1开始记录次数

代码

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<queue>
#define ll long long
using namespace std;
const int N=1e6+100;
int m,n;
int xx0,yy0,X,Y;
int mp[1010][1010],jd[1010][1010];
int flag=1;
int xx[5]={0,0,0,1,-1},yy[5]={0,1,-1,0,0};
struct node{int x,y,step;
};
void bfs(){queue<node>q;q.push((node){xx0,yy0,-1});while(!q.empty()){node o=q.front();q.pop();if(o.x==X&&o.y==Y){printf("%d",o.step);return;}for(int i=1;i<=4;i++){int nx=o.x,ny=o.y;while(1){nx+=xx[i];ny+=yy[i];if(nx<1||nx>n||ny<1||ny>m||mp[nx][ny]||jd[nx][ny]) break;q.push((node){nx,ny,o.step+1});jd[nx][ny]=1;} }}return;
}
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++) scanf("%1d",&mp[i][j]);}scanf("%d%d%d%d",&xx0,&yy0,&X,&Y);bfs();
}
/*
5 7 
1 0 0 0 0 1 0  
0 0 1 0 1 0 0  
0 0 0 0 1 0 1  
0 1 1 0 0 0 0  
0 0 0 0 1 1 0 
1 3 1 7
*/

T4 麻将游戏(mahjong)

在这里插入图片描述
在这里插入图片描述
这题也和上一题类似(本次模拟还真是循序渐进。。。)
不同是这个初始从1开始
另外这个可以走到棋盘外面,所以边界条件要改一下
(本题输入空格有些恶心,我使用的是直接gets)(getchar一知半解)

重点!!:

本题中我一开始的写法是:

while(1){nx+=xx[i];ny+=yy[i];if(nx==X&&ny==Y){ans=min(ans,o.step+1);}if(nx<0||nx>n+1||ny<0||ny>m+1||mp[nx][ny]=='X'||jd[nx][ny]) break;q.push((node){nx,ny,o.step+1});jd[nx][ny]=1;} 

但是这样会有大问题!!!
jd判断赋过值只意味着改点不用更新,但它后面的点仍然可能更新
所以这种情况下应该是continue而非break!!!
所以

代码

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<queue>
#define ll long long
using namespace std;
const int N=1e6+100;
int m,n;
int xx0,yy0,X,Y;
char mp[1010][1010];
int jd[1010][1010];
int flag=1;
int xx[5]={0,0,0,1,-1},yy[5]={0,1,-1,0,0};
struct node{int x,y,step;bool operator < (node y)const{return step>y.step;}
};
void bfs(){priority_queue<node>q;q.push((node){xx0,yy0,0});int ans=2e9;while(!q.empty()){node o=q.top();q.pop();for(int i=1;i<=4;i++){int nx=o.x,ny=o.y;while(1){nx+=xx[i];ny+=yy[i];if(nx==X&&ny==Y){ans=min(ans,o.step+1);}if(nx<0||nx>n+1||ny<0||ny>m+1||mp[nx][ny]=='X') break;if(jd[nx][ny]) continue;q.push((node){nx,ny,o.step+1});jd[nx][ny]=1;} }}if(ans==2e9) printf("0\n");else printf("%d\n",ans);return;
}
int main(){//本题xy坐标相反! scanf("%d%d\n",&m,&n);for(int i=1;i<=n;i++){gets(mp[i]+1);}while(1){scanf("%d%d%d%d",&yy0,&xx0,&Y,&X);if(xx0==0){//	printf("ksdhf");break;}memset(jd,0,sizeof(jd));bfs();}return 0;
}
/*
5 5
X  X
X     X  XX    
XXXXX   
1 1 4 4
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318692.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客题霸 [ 有重复项数字的所有排列] C++题解/答案

牛客题霸 [ 有重复项数字的所有排列] C题解/答案 题目描述 给出一组可能包含重复项的数字&#xff0c;返回该组数字的所有排列。 题解&#xff1a; 很多人应该都是用的递归方式来做&#xff0c;这里介绍一个stl的next_permutation 在头文件里&#xff0c;可以产生全排列 ne…

2021牛客暑期多校训练营7 F-xay loves trees(线段树+滑动窗口)

F-xay loves trees 考虑在树1中满足条件的一些点&#xff0c;首先不难想到一定是一条链&#xff0c;其次如果点uuu被选择那么在树2以uuu为根的子树的点就禁止被选&#xff0c;于是只需区间&#xff0c;然后查询区间最值是否存在>1也就是树2中覆盖次数超过2的节点即可。 首…

微软开发者大会:VS 2019 Preview 发布;Windows UX 主要技术开源

美国当地时间12月4日&#xff0c;微软正式举行 Microsoft Connect(); 2018 开发者大会&#xff0c;本次大会的 slogan 是"Build the apps of tomorrow, today."。在今年的大会上&#xff0c;看得出来微软不是憋了一个 —— 而是憋了一波大招。不妨先看一下这次大会微…

不止代码:迷宫问题(bfs)

题目描述 如下图所示&#xff0c;给出一个N*M的迷宫图和一个入口、一个出口。 编一个程序&#xff0c;打印一条从迷宫入口到出口的路径。这里黑色方块的单元表示走不通&#xff08;用-1表示&#xff09;&#xff0c;白色方块的单元表示可以走&#xff08;用0表示&#xff09;。…

asp.net core sdk runtime 镜像[已更新至2.2.0]

在官方镜像的脚本上&#xff0c;增加了System.Drawing相关的依赖库以北京时间为默认的时间2.2.0Windows SDK地址:官方: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/2.2.100/dotnet-sdk-2.2.100-win-x64.exe自己的加速地址: http://file.niusys.com/dotnet-sdk-2.2.10…

P7726-天体探测仪(Astral Detector)【构造】

正题 题目链接:https://www.luogu.com.cn/problem/P7726 题目大意 一个长度为nnn的排列&#xff0c;给出nnn个可重集SiS_iSi​表示所有长度为iii的区间的最小值构成的集合。 求构造这个排列。 1≤n≤8001\leq n\leq 8001≤n≤800 解题思路 对于一个数字&#xff0c;如果在S…

牛客题霸 [ 大数乘法] C++题解/答案

牛客题霸 [ 大数乘法] C题解/答案 题目描述 以字符串的形式读入两个数字&#xff0c;编写一个函数计算它们的乘积&#xff0c;以字符串形式返回。 &#xff08;字符串长度不大于10000&#xff0c;保证字符串仅由’0’~9’这10种字符组成&#xff09; 题解&#xff1a; 高精…

2021牛客暑期多校训练营5 D-Double Strings(dp+组合数)

D-Double Strings fi,jf_{i,j}fi,j​表示a中前i个字符&#xff0c;b中前j个字符相同子序列的数量&#xff0c;容斥转移 fi,jfi−1,jfi,j−1−fi−1,j−1{(1fi−1,j−1)[aiaj]}f_{i,j}f_{i-1,j}f_{i,j-1}-f_{i-1,j-1}\{(1f_{i-1,j-1})[a_ia_j]\}fi,j​fi−1,j​fi,j−1​−fi−1…

模板:强连通分量

总结 缩点是强连通分量的精髓 它能将任意图转化为一个有向无环图 然后就常常伴随有拓扑排序和dp传值 代码较长&#xff0c;重在理解awa 代码 &#xff08;本题dp是求经过点权之和最大的可重复路径的权值&#xff09; #include<bits/stdc.h> using namespace std; con…

[翻译] 使用 Visual Studio 2019 来提高每个开发人员的工作效率

原文: Making every developer more productive with Visual Studio 2019今天&#xff0c;在 Microsoft Connect(); 2018 的主题演讲中&#xff0c;Scott Guthrie 宣布推出 Visual Studio 2019 Preview 1。这是 Visual Studio 下一个主要版本的首次预览。在本预览版中&#xff…

P1791-[国家集训队]人员雇佣【最大权闭合图】

正题 题目链接:https://www.luogu.com.cn/problem/P1791 题目大意 有nnn个人&#xff0c;雇佣第iii个需要AiA_iAi​的费用&#xff0c;对于Ei,jE_{i,j}Ei,j​表示如果iii选了的话&#xff0c;选择jjj会获得Ei,jE_{i,j}Ei,j​的费用&#xff0c;不选jjj会花费Ei,jE_{i,j}Ei,j​…

牛客题霸 [ 寻找峰值] C++题解/答案

牛客题霸 [ 寻找峰值] C题解/答案 题目描述 山峰元素是指其值大于或等于左右相邻值的元素。给定一个输入数组nums&#xff0c;任意两个相邻元素值不相等&#xff0c;数组可能包含多个山峰。找到索引最大的那个山峰元素并返回其索引。 假设 nums[-1] nums[n] -∞。 题解&a…

2021牛客暑期多校训练营5 E-Eert Esiwtib(树形dp+位运算)

E-Eert Esiwtib 位运算考虑贡献时分0/1按位模拟考虑 fu,0/1/2f_{u,0/1/2}fu,0/1/2​表示子树u中点&#xff08;包括u&#xff09;到u所有路径的或/与/异或值。 转移的时候我们要考虑两个东西&#xff0c;一个是位运算对于路径值的影响&#xff0c;另一个是位运算对于所有路径…

大赛:2021省选 总结

文章目录概要想清楚再敲代码&#xff01;&#xff01;&#xff01;仔细审题&#xff01;&#xff01;&#xff01;Day1T1 卡牌游戏T2 矩阵游戏T3 图函数day 2T1 宝石T2 滚榜T3 支配概要 想清楚再敲代码&#xff01;&#xff01;&#xff01; 仔细审题&#xff01;&#xff01…

CometOJ-[Contest #10]鱼跃龙门【exgcd】

正题 题目链接:https://cometoj.com/problem/1479 题目大意 给出nnn求一个最小的x(x>0)x(x>0)x(x>0)满足 (∑i1xi)≡0(modn)\left(\sum_{i1}^xi\right)\equiv 0(\mod n)(i1∑x​i)≡0(modn) 1≤n≤1012,1≤T≤1001\leq n\leq 10^{12},1\leq T\leq 1001≤n≤1012,1≤…

牛客题霸 [ 最小的K个数] C++题解/答案

牛客题霸 [ 最小的K个数] C题解/答案 题目描述 输入n个整数&#xff0c;找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字&#xff0c;则最小的4个数字是1,2,3,4。 题解&#xff1a; 如果有n<k的就输出空vector 然后对input进行排序&#xff0c;取前k个值 代码&…

codeforces1559 D2. Mocha and Diana (Hard Version)(并查集+启发式合并+随机化)

D2. Mocha and Diana (Hard Version) RunningBeef题解 首先将图1的点与1号点所在的连通块相连&#xff0c;图2类似。 然后就是在图1和图2中选择没有和1号点在同一个连通块的点&#xff0c;能连边就连。 #include<bits/stdc.h> using namespace std; using lllong long…

ybtoj祭坛

文章目录冲啊&#xff01;&#xff08;100题祭&#xff09;125题祭140题祭首次登顶&唯一AC150题祭160题祭170题祭冲啊&#xff01;&#xff08;100题祭&#xff09; 2021.4.11 刚好100道 其实是前几天到的&#xff08;忘了是哪一道了。。。&#xff09; 今天写省选题解开了…

牛客题霸 [ 判断一棵二叉树是否为搜索二叉树和完全二叉树] C++题解/答案

牛客题霸 [ 判断一棵二叉树是否为搜索二叉树和完全二叉树] C题解/答案 题解&#xff1a; 搜索二叉树满足以下性质&#xff1a; 1.非空左子树的所以键值小于其根节点的键值 2.非空右子树的所有键值大于其根节点的键值 3.左&#xff0c;右子树都是二叉搜索树 完全二叉树&#x…

CF573D-Bear and Cavalry【动态dp】

正题 题目链接:https://www.luogu.com.cn/problem/CF573D 题目大意 给出nnn个人nnn匹马&#xff0c;每个人/马有能力值wiw_iwi​/hih_ihi​。 第iii个人开始对应第iii匹马&#xff0c;每个人不能选择对应的马&#xff0c;给每个人分配一个马后求最大的∑wihj\sum w_i\times …