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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

最少步数(dfs + bfs +bfs优化)

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

?

最少步數(shù)

時(shí)間限制:3000 ms ?|? 內(nèi)存限制:65535 KB 難度:4 描述

這有一個(gè)迷宮,有0~8行和0~8列:

?1,1,1,1,1,1,1,1,1
?1,0,0,1,0,0,1,0,1
?1,0,0,1,1,0,0,0,1
?1,0,1,0,1,1,0,1,1
?1,0,0,0,0,1,0,0,1
?1,1,0,1,0,1,0,0,1
?1,1,0,1,0,1,0,0,1
?1,1,0,1,0,0,0,0,1
?1,1,1,1,1,1,1,1,1

0表示道路,1表示墻。

現(xiàn)在輸入一個(gè)道路的坐標(biāo)作為起點(diǎn),再如輸入一個(gè)道路的坐標(biāo)作為終點(diǎn),問最少走幾步才能從起點(diǎn)到達(dá)終點(diǎn)?

(注:一步是指從一坐標(biāo)點(diǎn)走到其上下左右相鄰坐標(biāo)點(diǎn),如:從(3,1)到(4,1)。)

輸入
第一行輸入一個(gè)整數(shù)n(0<n<=100),表示有n組測(cè)試數(shù)據(jù);
隨后n行,每行有四個(gè)整數(shù)a,b,c,d(0<=a,b,c,d<=8)分別表示起點(diǎn)的行、列,終點(diǎn)的行、列。
輸出
輸出最少走幾步。
樣例輸入
2 3 1 5 7 3 1 6 7
樣例輸出
12 11 題解:dfs帶回溯;找最小步數(shù);還可以用廣搜BFS,以及用優(yōu)先隊(duì)列優(yōu)化;
代碼:
1 #include<stdio.h> 2 #include<string.h> 3 #define MIN(x,y) x<y?x:y 4 const int MAXN=10; 5 const int INF=1<<30; 6 int map[MAXN][MAXN]={ 7 {1,1,1,1,1,1,1,1,1}, 8 {1,0,0,1,0,0,1,0,1}, 9 {1,0,0,1,1,0,0,0,1}, 10 {1,0,1,0,1,1,0,1,1}, 11 {1,0,0,0,0,1,0,0,1}, 12 {1,1,0,1,0,1,0,0,1}, 13 {1,1,0,1,0,1,0,0,1}, 14 {1,1,0,1,0,0,0,0,1}, 15 {1,1,1,1,1,1,1,1,1} 16 }; 17 int disx[5]={0,-1,0,1}; 18 int disy[5]={1,0,-1,0}; 19 int a,b,c,d,min; 20 void dfs(int x,int y,int t){int nx,ny; 21 if(x==c&&y==d){ 22 min=MIN(min,t); 23 return ; 24 } 25 for(int i=0;i<4;i++){ 26 nx=x+disx[i];ny=y+disy[i]; 27 if(t+1<min&&!map[nx][ny]){ 28 map[nx][ny]=1; 29 dfs(nx,ny,t+1); 30 map[nx][ny]=0; 31 } 32 } 33 return ; 34 } 35 int main(){ 36 int T; 37 /* for(int x=0;x<9;x++){ 38 for(int y=0;y<9;y++)printf("%d ",map[x][y]); 39 puts(""); 40 }*/ 41 scanf("%d",&T); 42 while(T--){min=INF; 43 scanf("%d%d%d%d",&a,&b,&c,&d); 44 map[a][b]=1; 45 dfs(a,b,0); 46 map[a][b]=0; 47 printf("%d\n",min); 48 } 49 return 0;}

?廣搜:

1 #include<stdio.h> 2 #include<queue> 3 #include<string.h> 4 using namespace std; 5 const int INF=0xfffffff; 6 int disx[4]={0,1,-1,0}; 7 int disy[4]={1,0,0,-1}; 8 struct Node{ 9 int nx,ny,step; 10 }; 11 queue<Node>dl; 12 Node a,b; 13 int x,y,ex,ey,T,mi; 14 int map[10][10]; 15 void bfs(){ 16 map[x][y]=1; 17 a.nx=x;a.ny=y;a.step=0; 18 dl.push(a); 19 while(!dl.empty()){ 20 a=dl.front(); 21 dl.pop(); 22 map[a.nx][a.ny]=1; 23 if(a.nx==ex&&a.ny==ey){ 24 if(a.step<mi)mi=a.step; 25 map[ex][ey]=0; 26 } 27 for(int i=0;i<4;i++){ 28 b.nx=a.nx+disx[i];b.ny=a.ny+disy[i];b.step=a.step+1; 29 if(!map[b.nx][b.ny]&&b.step<=mi&&b.nx>=0&&b.ny>=0&&a.nx<9&&b.ny<9)dl.push(b); 30 } 31 } 32 } 33 int main(){ 34 scanf("%d",&T); 35 while(T--){int m[10][10]={ 36 {1,1,1,1,1,1,1,1,1}, 37 {1,0,0,1,0,0,1,0,1}, 38 {1,0,0,1,1,0,0,0,1}, 39 {1,0,1,0,1,1,0,1,1}, 40 {1,0,0,0,0,1,0,0,1}, 41 {1,1,0,1,0,1,0,0,1}, 42 {1,1,0,1,0,1,0,0,1}, 43 {1,1,0,1,0,0,0,0,1}, 44 {1,1,1,1,1,1,1,1,1} 45 }; 46 memcpy((int *)map,(int *)m,sizeof(m[0][0])*100); 47 scanf("%d%d%d%d",&x,&y,&ex,&ey); 48 mi=INF; 49 bfs(); 50 printf("%d\n",mi); 51 } 52 return 0; 53 } 1 #include<stdio.h> 2 #include<queue> 3 #include<string.h> 4 using namespace std; 5 const int INF=0xfffffff; 6 int disx[4]={0,1,-1,0}; 7 int disy[4]={1,0,0,-1}; 8 struct Node{ 9 int nx,ny,step; 10 friend bool operator < (Node a,Node b){ 11 return a.step > b.step; 12 } 13 }; 14 priority_queue<Node>dl; 15 Node a,b; 16 int x,y,ex,ey,T,mi; 17 int map[10][10]; 18 void bfs(){ 19 map[x][y]=1; 20 a.nx=x;a.ny=y;a.step=0; 21 dl.push(a); 22 while(!dl.empty()){ 23 a=dl.top(); 24 dl.pop(); 25 map[a.nx][a.ny]=1; 26 if(a.nx==ex&&a.ny==ey){ 27 if(a.step<mi)mi=a.step; 28 map[ex][ey]=0; 29 } 30 for(int i=0;i<4;i++){ 31 b.nx=a.nx+disx[i];b.ny=a.ny+disy[i];b.step=a.step+1; 32 if(!map[b.nx][b.ny]&&b.step<=mi&&b.nx>=0&&b.ny>=0&&a.nx<9&&b.ny<9)dl.push(b); 33 } 34 } 35 } 36 int main(){ 37 scanf("%d",&T); 38 while(T--){int m[10][10]={ 39 {1,1,1,1,1,1,1,1,1}, 40 {1,0,0,1,0,0,1,0,1}, 41 {1,0,0,1,1,0,0,0,1}, 42 {1,0,1,0,1,1,0,1,1}, 43 {1,0,0,0,0,1,0,0,1}, 44 {1,1,0,1,0,1,0,0,1}, 45 {1,1,0,1,0,1,0,0,1}, 46 {1,1,0,1,0,0,0,0,1}, 47 {1,1,1,1,1,1,1,1,1} 48 }; 49 memcpy((int *)map,(int *)m,sizeof(m[0][0])*100); 50 scanf("%d%d%d%d",&x,&y,&ex,&ey); 51 mi=INF; 52 bfs(); 53 printf("%d\n",mi); 54 } 55 return 0; 56 }

?

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

總結(jié)

以上是生活随笔為你收集整理的最少步数(dfs + bfs +bfs优化)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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