目录

  • Jelly【简单bfs】
  • maze【建图求最短路】
  • wyh的迷宫【BFS】
  • 幸运数字Ⅱ【爆搜】
  • 迷宫【变种的bfs】
  • 走出迷宫【模板dfs】
  • 魔法数字【状态转移bfs】

Jelly【简单bfs】


https://ac.nowcoder.com/acm/problem/201613

#include<bits/stdc++.h>
using namespace std;
const int N=110;
struct node{int x,y,z,step;};
char a[N][N][N];
int st[N][N][N],n;
int dx[6]={-1,0,0,1,0,0};
int dy[6]={0,1,-1,0,0,0};
int dz[6]={0,0,0,0,-1,1};
int bfs()
{queue<node>q; q.push({1,1,1,1});st[1][1][1]=1;while(q.size()){auto temp=q.front(); q.pop();int x=temp.x,y=temp.y,z=temp.z,t=temp.step;if(x==n&&y==n&&z==n) return t;for(int i=0;i<6;i++){int tempx=x+dx[i];int tempy=y+dy[i];int tempz=z+dz[i];if(tempx<1||tempx>n||tempy<1||tempy>n||tempz<1||tempz>n) continue;if(st[tempz][tempx][tempy]) continue;if(a[tempz][tempx][tempy]=='*') continue;st[tempz][tempx][tempy]=1;q.push({tempx,tempy,tempz,t+1});}}return -1;
}
int main(void)
{cin>>n;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)for(int z=1;z<=n;z++)cin>>a[i][j][z];cout<<bfs();return 0;
}

maze【建图求最短路】


https://ac.nowcoder.com/acm/problem/15665
根据题意建图,跑最短路即可

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
const int M=1e5*4+10;
typedef pair<int,int> PII;
int dist[M],h[M],e[M],w[M],ne[M],idx,vis[M];
string a[N];
int n,m,t,st,ed;
void init()
{memset(vis,0,sizeof vis);memset(h,-1,sizeof h);idx=0;
}
void add(int a,int b,int c)
{e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
int get(int x,int y) {return x*n+y;}
void build(int x,int y)
{int dx[2]={0,1},dy[2]={1,0};for(int i=0;i<2;i++){int tempx=x+dx[i];int tempy=y+dy[i];if(tempx<0||tempx>=n||tempy<0||tempy>=m) continue;if(a[tempx][tempy]=='#') continue;int s1=get(x,y),s2=get(tempx,tempy);add(s1,s2,1),add(s2,s1,1);}
}
void Dijkstra(int st)
{memset(dist,0x3f,sizeof dist);priority_queue<PII,vector<PII>,greater<PII>>q; q.push({0,st});dist[st]=0;while(q.size()){auto temp=q.top(); q.pop();int u=temp.second;if(vis[u]) continue;vis[u]=1;for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(dist[j]>dist[u]+w[i]){dist[j]=dist[u]+w[i];q.push({dist[j],j});}}}
}
int main(void)
{while(cin>>n>>m>>t){init();for(int i=0;i<n;i++) cin>>a[i];for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(a[i][j]!='#')  build(i,j);if(a[i][j]=='S') st=get(i,j);if(a[i][j]=='T') ed=get(i,j);}}while(t--){int x,y,xx,yy; cin>>x>>y>>xx>>yy;if(a[x][y]!='#'&&a[xx][yy]!='#') add(get(x,y),get(xx,yy),3);}Dijkstra(st);if(dist[ed]>0x3f3f3f3f/2) cout<<-1<<endl;else cout<<dist[ed]<<endl;}return 0;
}

wyh的迷宫【BFS】


https://ac.nowcoder.com/acm/problem/15434

#include<bits/stdc++.h>
using namespace std;
const int N=510;
char a[N][N];
int st[N][N],t,n,m;
int stx,sty,edx,edy;
struct node{int x,y,step;};
int bfs()
{queue<node>q; q.push({stx,sty,0});st[stx][sty]=1;while(q.size()){auto temp=q.front(); q.pop();int x=temp.x,y=temp.y,t=temp.step;if(x==edx&&y==edy) return t;int dx[4]={-1,0,0,1};int dy[4]={0,1,-1,0};for(int i=0;i<4;i++){int tempx=x+dx[i];int tempy=y+dy[i];if(tempx<0||tempx>=n||tempy<0||tempy>=m) continue;if(a[tempx][tempy]=='x') continue;if(st[tempx][tempy]) continue;st[tempx][tempy]=1;q.push({tempx,tempy,t+1});}}return -1;
}
int main(void)
{cin>>t;while(t--){cin>>n>>m;memset(st,0,sizeof st);for(int i=0;i<n;i++)for(int j=0;j<m;j++){cin>>a[i][j];if(a[i][j]=='s') stx=i,sty=j;if(a[i][j]=='t') edx=i,edy=j;}int ans=bfs();if(ans!=-1) puts("YES");else puts("NO");}return 0;
}

幸运数字Ⅱ【爆搜】


https://ac.nowcoder.com/acm/problem/15291
先打表,然后二分找到相应的位置,每次计算一段的值。

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e5+10;
LL sum,s[N],l,r;
vector<LL>ve;
void dfs(LL u)
{if(u>1e9) return;ve.push_back(u);dfs(u*10+4);dfs(u*10+7);
}
int main(void)
{cin>>l>>r;dfs(0);sort(ve.begin(),ve.end()); ve.push_back(4444444444);int L=lower_bound(ve.begin(),ve.end(),l)-ve.begin();int R=lower_bound(ve.begin(),ve.end(),r)-ve.begin();for(int i=L;i<=R;i++){sum+=(min(ve[i],r)-l+1)*ve[i];//计算间隔的数的值。l=ve[i]+1;}cout<<sum;return 0;
}

迷宫【变种的bfs】


https://ac.nowcoder.com/acm/problem/15136
分为两种情况:

  • 一种是直接到目的地
  • 先到钥匙那里,再到目的地。
#include<bits/stdc++.h>
using namespace std;
const int N=510;
char a[N][N];
int st[N][N],n,m;
int stx,sty,endx,endy;
int keyx,keyy;
struct node{int x,y,step;};
int bfs(int x,int y,int endx,int endy,int flag)
{memset(st,0,sizeof st);queue<node>q; q.push({x,y,0});st[x][y]=1;int dx[4]={-1,0,0,1};int dy[4]={0,-1,1,0};while(q.size()){auto temp=q.front(); q.pop();int x=temp.x,y=temp.y,u=temp.step;if(x==endx&&y==endy) return u;for(int i=0;i<4;i++){int tempx=x+dx[i];int tempy=y+dy[i];if(tempx<0||tempx>=n||tempy<0||tempy>=m) continue;if(st[tempx][tempy]) continue;if(a[tempx][tempy]=='W') continue;if(!flag&&a[tempx][tempy]=='D') continue;st[tempx][tempy]=1;q.push({tempx,tempy,u+1});}}return 0x3f3f3f3f;
}
int main(void)
{cin>>n>>m;for(int i=0;i<n;i++)for(int j=0;j<m;j++){cin>>a[i][j];if(a[i][j]=='S') stx=i,sty=j;if(a[i][j]=='E') endx=i,endy=j;if(a[i][j]=='K') keyx=i,keyy=j;}int ans1=bfs(stx,sty,endx,endy,0);int ans2=bfs(stx,sty,keyx,keyy,0)+bfs(keyx,keyy,endx,endy,1);int ans=min(ans1,ans2);if(ans>=0x3f3f3f3f) cout<<-1;else cout<<ans;return 0;
}

走出迷宫【模板dfs】


https://ac.nowcoder.com/acm/problem/14572

#include<bits/stdc++.h>
using namespace std;
const int N=510;
int st[N][N],n,m,stx,sty,edx,edy;
char a[N][N];
int dx[4]={-1,0,0,1};
int dy[4]={0,-1,1,0};
bool dfs(int x,int y)
{if(x==edx&&y==edy) return true;bool flag=false;st[x][y]=1;for(int i=0;i<4;i++){int tempx=x+dx[i];int tempy=y+dy[i];if(tempx<0||tempx>=n||tempy<0||tempy>=m) continue;if(a[tempx][tempy]=='#') continue;if(st[tempx][tempy]) continue;flag=max(flag,dfs(tempx,tempy));}return flag;
}
int main(void)
{while(cin>>n>>m){memset(st,0,sizeof st);for(int i=0;i<n;i++)for(int j=0;j<m;j++){cin>>a[i][j];if(a[i][j]=='S') stx=i,sty=j;if(a[i][j]=='E') edx=i,edy=j;}if(dfs(stx,sty)) puts("Yes");else puts("No");}
}

魔法数字【状态转移bfs】


https://ac.nowcoder.com/acm/problem/202589

class Solution {public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param n int整型 表示牛牛的数字* @param m int整型 表示牛妹的数字* @return int整型*/int bfs(int n,int m){unordered_map<int,int>mp;queue<int>q; q.push(n); mp[n]=0;while(q.size()){auto t=q.front(); q.pop();if(t==m) return mp[t];int dx[3]={1,-1,t*t-t};for(int i=0;i<3;i++){int x=t+dx[i];if(x<=-10000||x>3000) continue;if(mp.count(x)) continue;q.push(x); mp[x]=mp[t]+1;}}return -1;}int solve(int n, int m) {// write code herereturn bfs(n,m);}};

2021算法竞赛入门班第四节课【搜索】练习题相关推荐

  1. 2021算法竞赛入门班第十节课【字符串】练习题

    目录 救救企鹅[KMP] 救救企鹅[KMP] https://ac.nowcoder.com/acm/problem/20862 KMP匹配,记录匹配的开始下标. #include<bits/s ...

  2. 2021算法竞赛入门班第七节课【图论】练习题

    目录 挖沟[最小生成树板子题] 公交线路[最短路板子题] 道路建设[最小生成树] 挖沟[最小生成树板子题] https://ac.nowcoder.com/acm/problem/17509 #inc ...

  3. 2021算法竞赛入门班第九节课【线段树】练习题

    题单地址:https://ac.nowcoder.com/acm/problem/collection/1265?asc=true&order=difficulty 目录 情人节的电灯泡[二维 ...

  4. 2021算法竞赛入门班第二节课【递归、分治、二分】练习题

    目录 华华给月月准备礼物[二分] The Biggest Water Problem[模拟] Bits[递归模拟 / 未完成] [NOIP2004]FBI树[树的后序遍历] [USACO 2009 D ...

  5. 2021算法竞赛入门班第一节课【枚举、贪心】习题

    目录 [USACO 2007 Jan S]保护花朵[经典贪心] [NOIP2005]校门外的树[区间合并] [NOIP2006]明明的随机数[签到] [HNOI2003]激光炸弹[二维前缀和] 铺地毯 ...

  6. 2021算法竞赛入门班第一节课枚举贪心习题

    文章目录 1.明明的随机数 2.回文日期 3.校门外的树 4.数学考试 5.Subsequence 6.字符串 7.丢手绢 8.拼数 9.纪念品分组 10.国王的游戏 11.铺地毯 12.「土」巨石滚 ...

  7. 2021算法竞赛入门班第八节课【数学】习题

    目录) 最大公约数(lcm) [NOIP2011]计算系数[组合数] 大水题[容斥定理] 最大公约数(lcm) https://ac.nowcoder.com/acm/problem/16710 #i ...

  8. 2021算法竞赛入门班第三节课【堆、栈、队列、并查集】等习题

    目录 新建 Microsoft Office Word 文档[小根堆] 加边的无向图[并查集] 好串[栈 / 括号匹配] [NOIP2004]合并果子[小根堆] DongDong认亲戚[并查集] 新建 ...

  9. (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

    下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinej ...

最新文章

  1. 单招计算机应用基础试题及答案,对口单招计算机应用基础模拟试题
  2. 【Git】Git 分支管理 ( 解决分支合并冲突 | 创建并切换分支 git switch -c feature1 | 修改 feature1 分支并提交 | 修改 master 主版本并提交 )
  3. scrum回顾_3步开好回顾会 | IDCF FDCC认证学员作品
  4. STOLUCK:经济下行的当下 ,STO或将帮助中小企业度过寒冬
  5. keepalived和heartbeat区别
  6. log4j.appender.stdout.layout.ConversionPattern
  7. oracle ogg和adg,ORACLE12C ADG和OGG的搭配使用
  8. 南天PR系列存折打印机驱动程序
  9. C# 提取PDF中的表格
  10. 中国首档「程序员真人秀」综艺登上热搜,燃炸了!
  11. signature=9aadee6a3f882c84134bf5f6f04d2c93,Fw: Updated Scor Input Requirements
  12. 和弦笔记:和弦组成音/和弦命名规律/sus和add的区别
  13. 【飞轮储能】基于matlab simulink飞轮储能(永磁同步电机)仿真【含Matlab源码 2421期】
  14. 查看jvm的运行参数
  15. 生成Base64编码格式的二维码图片(添加url地址图片logo)
  16. 计算机开模拟器,iOS在同一台电脑上打开多个模拟器
  17. 【概率论】几种常见的概率分布表
  18. python随机打乱一个文本中每行数据
  19. 12.1-12.8 计算机网络课堂笔记
  20. win10这里的以太网,不知道怎么消失了

热门文章

  1. 3dmax2014:打开3dmax2014软件时,出现许可证检出失败 错误20
  2. BizTalk开发系列(三十一)配置和使用HTTP适配器
  3. 数组作为形参时的一个陷阱
  4. 2019.1.11英语笔记1
  5. Springboot 连接数据库
  6. ADO.NET 【属性扩展】性别、年龄、编号
  7. KaleidoscopeGame
  8. Windows Batch [精华]
  9. Qt之debug和写log文件
  10. 智能合约重构社会契约(10)超级账本之跨链Hyperledger Lab