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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

POJ 327820493083

發(fā)布時(shí)間:2024/4/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ 327820493083 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  這次的題目叫圖的深度&&廣度優(yōu)先遍歷。

  然后等我做完了題發(fā)現(xiàn)這是DFS&&BFS爆搜專題。

  3278:題目是經(jīng)典的FJ,他要抓奶牛。他和牛(只有一頭)在一條數(shù)軸上,他們都站在一個(gè)點(diǎn)上(坐標(biāo)為0~1e5)。假設(shè)FJ的位置為x,他每次可以去x+1,x-1,x*2的地方。問他最少走幾次才能抓到他的牛(牛不會(huì)動(dòng))。

  赤裸裸的BFS,注意判斷是否越界(很容易R(shí)E)

  CODE

#include<cstdio> #include<cstring> using namespace std; const int N=100000; int q[N*3+10],step[N+5],n,k; bool vis[N+5]; inline void read(int &x) {x=0; char ch=getchar();while (ch<'0'||ch>'9') ch=getchar();while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); } int main() {read(n); read(k);memset(vis,true,sizeof(vis));if (n>=k) printf("%d",n-k); else{int head=0,tail=1;q[1]=n; step[n]=0; vis[n]=0;while (head<tail){int now=q[++head];if (now==k) { printf("%d",step[now]); break; }if (now+1<=N) if (vis[now+1]) vis[now+1]=0,q[++tail]=now+1,step[now+1]=step[now]+1;if (now-1>=0) if (vis[now-1]) vis[now-1]=0,q[++tail]=now-1,step[now-1]=step[now]+1;if (now*2<=N) if (vis[now*2]) vis[now*2]=0,q[++tail]=now*2,step[now*2]=step[now]+1;}}return 0; }

?

  2049:一道迷宮BFS,和今年NOIP PJ T3 有點(diǎn)類似。題意可以百度翻譯(這道題翻譯的還是很好的,至少能看懂)

  因?yàn)樗o出的是網(wǎng)格的邊而不是點(diǎn),所以要進(jìn)行轉(zhuǎn)化。

  我們用a[x][y][0]表示(x,y)右方向的邊的屬性(墻或門或空地),a[x][y][1]表示(x,y)上方向的邊的屬性(同理)

  建圖玩了以后可以再連邊跑SPFA或者直接松弛BFS(循環(huán)更新到每個(gè)點(diǎn)的的最小通過門數(shù))

  最后提醒那個(gè)人有可能不在迷宮里,就直接輸出0

  CODE

#include<cstdio> #include<cmath> using namespace std; const int N=205,INF=1e9,fx[4]={0,1,-1,0},fy[4]={1,0,0,-1}; int a[N][N][2],f[N][N],q[N*N*10+10][2],n,m,i,j,x,y,d,t; double s_x,s_y; inline void read(int &x) {x=0; char ch=getchar(); int flag=1;while (ch<'0'||ch>'9') { if (ch=='-') flag=-1; ch=getchar(); }while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();x*=flag; } int main() {for (;;){read(n); read(m);if (n==-1&&m==-1) break;for (i=0;i<N;++i)for (j=0;j<N;++j)f[i][j]=INF,a[i][j][0]=a[i][j][1]=2;for (i=1;i<=n;++i){read(x); read(y); read(d); read(t);if (d) {for (j=y;j<y+t;++j)a[x][j][1]=0;} else{for (j=x;j<x+t;++j)a[j][y][0]=0;}}for (i=1;i<=m;++i){read(x); read(y); read(d);if (d) a[x][y][1]=1; else a[x][y][0]=1;}scanf("%lf%lf",&s_x,&s_y);x=floor(s_x); y=floor(s_y);if (x<0||y<0||x>199||y>199||(!n&&!m)) { puts("0"); continue; }int head=0,tail=1;q[1][0]=x; q[1][1]=y; f[x][y]=0;while (head<tail){x=q[++head][0]; y=q[head][1];for (i=0;i<4;++i){int xx=x+fx[i],yy=y+fy[i];if (xx<0||yy<0||xx>200||yy>200) continue;if (i==0){if (a[xx][yy][0]==2) if (f[xx][yy]>f[x][y]) q[++tail][0]=xx,q[tail][1]=yy,f[xx][yy]=f[x][y];if (a[xx][yy][0]==1) if (f[xx][yy]>f[x][y]+1) q[++tail][0]=xx,q[tail][1]=yy,f[xx][yy]=f[x][y]+1;} if (i==1){if (a[xx][yy][1]==2) if (f[xx][yy]>f[x][y]) q[++tail][0]=xx,q[tail][1]=yy,f[xx][yy]=f[x][y];if (a[xx][yy][1]==1) if (f[xx][yy]>f[x][y]+1) q[++tail][0]=xx,q[tail][1]=yy,f[xx][yy]=f[x][y]+1;}if (i==2){if (a[x][y][1]==2) if (f[xx][yy]>f[x][y]) q[++tail][0]=xx,q[tail][1]=yy,f[xx][yy]=f[x][y];if (a[x][y][1]==1) if (f[xx][yy]>f[x][y]+1) q[++tail][0]=xx,q[tail][1]=yy,f[xx][yy]=f[x][y]+1;}if (i==3){if (a[x][y][0]==2) if (f[xx][yy]>f[x][y]) q[++tail][0]=xx,q[tail][1]=yy,f[xx][yy]=f[x][y];if (a[x][y][0]==1) if (f[xx][yy]>f[x][y]+1) q[++tail][0]=xx,q[tail][1]=yy,f[xx][yy]=f[x][y]+1;}}}if (f[0][0]==INF) puts("-1"); else printf("%d\n",f[0][0]);}return 0; }

?

  3083:這是一道神坑題,完美的展示了爆搜的含義。

  題意是一個(gè)圖,S起點(diǎn),E終點(diǎn),.是空地,#是墻不能走。問從S到E左優(yōu)先和右優(yōu)先以及最短步數(shù)是多少。

  DFS+BFS。BFS最短和簡(jiǎn)單,終點(diǎn)的DFS。

  因?yàn)樗笞裱笥业男再|(zhì),所以方向數(shù)組的定義就很玄學(xué)了

  以左優(yōu)先為例 如果現(xiàn)在的方向是↑,那么優(yōu)先級(jí)就是←↑→↓,其他方向同理(能左轉(zhuǎn)就左轉(zhuǎn),不能轉(zhuǎn)就向右轉(zhuǎn)再判斷),右優(yōu)先同理。

  因此預(yù)處理一下坐標(biāo)的順序就很水了。

  CODE

#include<cstdio> #include<iostream> #include<cstring> using namespace std; const int N=45, l[4][4]= {{3,0,1,2},{0,1,2,3},{1,2,3,0},{2,3,0,1}, }, r[4][4]= {{1,0,3,2},{2,1,0,3},{3,2,1,0},{0,3,2,1}, }, fx[4]={0,-1,0,1},fy[4]={-1,0,1,0}; char a[N][N]; int q[N*N*10+10][2],step[N][N],i,j,n,m,s_x,s_y,e_x,e_y,t,w,l_ans,r_ans,min_ans; bool vis[N][N],flag; inline void read(int &x) {x=0; char ch=getchar();while (ch<'0'||ch>'9') ch=getchar();while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); } inline void l_DFS(int x,int y,int w,int s) {if (flag) return;if (x==e_x&&y==e_y) { l_ans=s; flag=1; return; }for (int i=0;i<4;++i){int xx=x+fx[l[w][i]],yy=y+fy[l[w][i]];if (xx<=0||yy<=0||xx>n||yy>m) continue;if (a[xx][yy]=='#') continue;l_DFS(xx,yy,l[w][i],s+1);} } inline void r_DFS(int x,int y,int w,int s) {if (flag) return;if (x==e_x&&y==e_y) { r_ans=s; flag=1; return; }for (int i=0;i<4;++i){int xx=x+fx[r[w][i]],yy=y+fy[r[w][i]];if (xx<=0||yy<=0||xx>n||yy>m) continue;if (a[xx][yy]=='#') continue;r_DFS(xx,yy,r[w][i],s+1);} } inline void BFS(int s_x,int s_y) {memset(step,0,sizeof(step));memset(vis,true,sizeof(vis));int head=0,tail=1;q[1][0]=s_x; q[1][1]=s_y; step[s_x][s_y]=1; vis[s_x][s_y]=0;while (head<tail){int x=q[++head][0],y=q[head][1];if (x==e_x&&y==e_y) { min_ans=step[x][y]; return; }for (int i=0;i<4;++i){int xx=x+fx[i],yy=y+fy[i];if (xx<=0||yy<=0||xx>n||yy>m) continue;if (a[xx][yy]=='#'||!vis[xx][yy]) continue;q[++tail][0]=xx; q[tail][1]=yy; step[xx][yy]=step[x][y]+1; vis[xx][yy]=0;}} } int main() { read(t);while (t--){read(m); read(n);for (i=1;i<=n;++i)for (j=1;j<=m;++j){cin>>a[i][j];if (a[i][j]=='S') s_x=i,s_y=j;if (a[i][j]=='E') e_x=i,e_y=j;}if (s_x==1) w=3; if (s_x==n) w=1; if (s_y==1) w=2; if (s_y==m) w=0;flag=0; l_DFS(s_x,s_y,w,1); flag=0; r_DFS(s_x,s_y,w,1); BFS(s_x,s_y);printf("%d %d %d\n",l_ans,r_ans,min_ans);}return 0; }

?

轉(zhuǎn)載于:https://www.cnblogs.com/cjjsb/p/8444969.html

總結(jié)

以上是生活随笔為你收集整理的POJ 327820493083的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。