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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

HDU 1728 逃离迷宫【BFS】

發布時間:2024/8/24 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU 1728 逃离迷宫【BFS】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:給出一個起點,一個終點,規定的轉彎次數,問能否在規定的轉彎次數內到達終點---

這一題是學(看)習(題)的(解)@_@

主要學了兩個地方

一個是剪枝,如果搜到的當前點的轉彎次數小于該點turn數組記錄下來的轉彎次數,才有必要將它加入隊列。

另一個是記錄轉彎方向 在結構體里面定義一個turn來記錄轉彎的個數,用dir來記錄當前所在的方向(因為搜的時候是四個方向dir[4][2]來搜的,直接用i確定當前方向即可)

想想自己第一次做的時候的doubi想法,用dfs做,然后dfs(x,y,px,py),再判斷由(x+dir[i][0],y+dir[i][1])與(x,y)構成的直線斜率和(x,y)和(px,py)構成的斜率乘積是否為-1-----果斷沒有寫對----

1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 using namespace std; 7 int turn[105][105]; 8 int n,m,k; 9 int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; 10 char map[105][105]; 11 struct node 12 { 13 int x,y; 14 int turn,dir;//用turn來記錄轉彎的個數,用dir來記錄當前的方向 15 } st,en,now,next; 16 queue<node>q; 17 void bfs() 18 { 19 while(!q.empty()) q.pop(); 20 now.x=st.x;now.y=st.y;now.dir=-5;now.turn=0;//初始的方向可以定義為任意一個后來不會出現的方向 21 turn[now.x][now.y]=0; //在起點時可以轉向任意方向,令為0 22 q.push(now); 23 while(!q.empty()) 24 { 25 now=q.front();q.pop(); 26 27 for(int i=0;i<4;i++) 28 { 29 next.x=now.x+dir[i][0]; 30 next.y=now.y+dir[i][1]; 31 next.dir=now.dir; 32 next.turn=now.turn; 33 if(now.x==en.x&&now.y==en.y&&now.turn<=k) 34 { 35 printf("yes\n"); 36 return; 37 } 38 if(next.x<1||next.x>m||next.y<1||next.y>n||map[next.x][next.y]=='*') continue;//第一次剪枝 39 if(next.dir!=i&&next.dir!=-5) //如果當前方向和起始不同,則turn++ 40 next.turn++; 41 if(next.turn>k) continue;//第二次剪 枝,轉彎次數超過了,則剪枝 42 if(next.x==en.x&&next.y==en.y&&next.turn<=k) 43 { 44 printf("yes\n"); 45 return; 46 } 47 48 if(next.turn<=turn[next.x][next.y])//第三次剪枝,如果當前轉彎的個數小于當前點的轉彎個數,才有繼續搜索的必要 49 { 50 next.dir=i; 51 turn[next.x][next.y]=next.turn; 52 q.push(next); 53 } 54 } 55 } 56 printf("no\n"); 57 return; 58 } 59 int main() 60 { 61 int ncase,i,j; 62 scanf("%d",&ncase); 63 while(ncase--) 64 { 65 scanf("%d %d",&m,&n); 66 for(i=1;i<=m;i++) 67 for(j=1;j<=n;j++) 68 { 69 cin>>map[i][j]; 70 turn[i][j]=1000000;//初始化 每一點的轉彎個數為一個極大的值 71 } 72 cin>>k>>st.y>>st.x>>en.y>>en.x; 73 bfs(); 74 } 75 } View Code

?

轉載于:https://www.cnblogs.com/wuyuewoniu/p/4295746.html

總結

以上是生活随笔為你收集整理的HDU 1728 逃离迷宫【BFS】的全部內容,希望文章能夠幫你解決所遇到的問題。

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