日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2021算法竞赛入门班第四节课【搜索】练习题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 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算法竞赛入门班第四节课【搜索】练习题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 97超碰国产在线 | 国产永久视频 | 色婷婷在线观看视频 | 亚洲午夜精选 | 日韩一区二区三区在线观看视频 | 欧美做爰啪啪xxxⅹ性 | 麻豆av免费看| 国产欧美二区 | 一区二区三区久久精品 | 91精品视频网站 | 亚洲区 欧美区 | 色综合久久88色综合天天6 | 亚洲视频在线免费看 | 欧美精品在线观看一区二区 | 日韩五码在线 | 日韩 欧美 自拍 | 午夜影院a| 亚洲另类色图 | 国产精品1000 | 性感美女在线 | 小色哥网站 | 久久伊人婷婷 | 久久久久久久久免费 | 污网站免费 | 亚洲激情视频在线 | 成人h动漫精品一区二区下载 | 国产特级视频 | 网址av| 国产亚洲精品网站 | 亚洲天堂福利视频 | 国产免费91| 天天av天天操 | 又黄又爽视频在线观看 | 亚洲aa在线观看 | 夜夜夜夜爽 | 日韩一区二区三区免费 | 日本一二三区视频 | 国产剧情在线视频 | 在线不卡日韩 | 台湾佬在线| 成人精品视频一区二区 | 爱情岛黄色 | 亚洲最大毛片 | 黄色av网址在线观看 | 大粗鳮巴久久久久久久久 | 最新日韩一区 | av青青草 | 欧美性猛交xxxx偷拍洗澡 | 99在线成人精品视频 | 人人草在线观看 | 朝桐光在线观看 | 亚洲男男网站 | 成人精品黄段子 | 双性懵懂美人被强制调教 | 天天射夜夜撸 | 天天操夜夜操夜夜操 | 国产免费黄色av | 亚洲精品一区二区三区蜜桃久 | 亚洲精品国产综合 | 狼人精品一区二区三区在线 | 蜜乳av 懂色av 粉嫩av | 精品免费在线 | 久久丫精品| 黄色无遮挡网站 | 亚洲欧美日韩国产综合 | 成人黄色一级视频 | 在线观看视频免费 | 成人免费毛片视频 | 国产精品99视频 | 天天干夜夜艹 | 日本黄色播放器 | 人人看超碰 | 久久国语精品 | 日本激情在线 | 少妇xxxxxx| 久久精品视频3 | 色悠悠久久综合 | 丰满少妇影院 | 久久人妻少妇嫩草av蜜桃 | 被黑人啪到哭的番号922在线 | 日本成人一区二区三区 | 久久久久国产精品夜夜夜夜夜 | 国产精品电影院 | 成人小视频在线观看 | 国产免费麻豆 | 中文字幕日韩欧美在线 | 黄色激情在线观看 | 可以在线观看av的网站 | 欧美嫩交| 在线日韩一区二区 | 操碰人人| 一级成人免费 | 波多野吉衣中文字幕 | 久久99精品国产麻豆婷婷洗澡 | 欧美美女一区二区 | 成人免费久久 | 青娱网电信一区电信二区电信三区 | 在线视频精品一区 | 日韩福利电影在线 |