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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

hdu 1254(dfs+bfs+优先队列)

發(fā)布時間:2025/3/16 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 1254(dfs+bfs+优先队列) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

推箱子

Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 65536/32768 K (Java/Others)

Problem Description 推箱子是一個很經(jīng)典的游戲.今天我們來玩一個簡單版本.在一個M*N的房間里有一個箱子和一個搬運工,搬運工的工作就是把箱子推到指定的位置,注意,搬運工只能推箱子而不能拉箱子,因此如果箱子被推到一個角上(如圖2)那么箱子就不能再被移動了,如果箱子被推到一面墻上,那么箱子只能沿著墻移動.

現(xiàn)在給定房間的結(jié)構(gòu),箱子的位置,搬運工的位置和箱子要被推去的位置,請你計算出搬運工至少要推動箱子多少格.



Input 輸入數(shù)據(jù)的第一行是一個整數(shù)T(1<=T<=20),代表測試數(shù)據(jù)的數(shù)量.然后是T組測試數(shù)據(jù),每組測試數(shù)據(jù)的第一行是兩個正整數(shù)M,N(2<=M,N<=7),代表房間的大小,然后是一個M行N列的矩陣,代表房間的布局,其中0代表空的地板,1代表墻,2代表箱子的起始位置,3代表箱子要被推去的位置,4代表搬運工的起始位置.

Output 對于每組測試數(shù)據(jù),輸出搬運工最少需要推動箱子多少格才能幫箱子推到指定位置,如果不能推到指定位置則輸出-1.

Sample Input 1 5 5 0 3 0 0 0 1 0 1 4 0 0 0 1 0 0 1 0 2 0 0 0 0 0 0 0
Sample Output 4 解題思路:首先想到的肯定是bfs+優(yōu)先隊列,每個節(jié)點記錄的是箱子的位置,以及推動箱子的次數(shù)和箱子移動的方向,每次推箱子之前,箱子有四個方向選擇,每個方向能否推動主要是看人是否可以到箱子的背后去推它。這里可以用dfs去搜索。 #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std;struct Node {int x,y;int cnt,d; //d表示當前移動的位置Node(){}Node(int _x,int _y,int _cnt,int _d){x = _x, y = _y;cnt = _cnt, d = _d;}friend bool operator < (const Node &a,const Node &b){return a.cnt > b.cnt;} }; int n,m,map[10][10]; int sx,sy,ex,ey; int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; bool vis[10][10][4],reach[10][10];void dfs(int x,int y,int tx,int ty) //(tx,ty)表示此時箱子的位置 {reach[x][y] = true;for(int i = 0; i < 4; i++){int newx = x + dir[i][0];int newy = y + dir[i][1];if(newx == tx && newy == ty) continue;if(newx < 1 || newx > n || newy < 1 || newy > m) continue;if(map[newx][newy] == 1 || reach[newx][newy] == true) continue;dfs(newx,newy,tx,ty);} }int bfs(int tx,int ty) //(tx,ty)表示初始時,箱子的位置 {priority_queue<Node> que;memset(vis,false,sizeof(vis));memset(reach,false,sizeof(reach));Node cur,next;dfs(sx,sy,tx,ty);if(reach[tx+1][ty] == true)que.push(Node(tx,ty,0,0));if(reach[tx-1][ty] == true)que.push(Node(tx,ty,0,1));if(reach[tx][ty+1] == true)que.push(Node(tx,ty,0,2));if(reach[tx][ty-1] == true)que.push(Node(tx,ty,0,3));while(!que.empty()){cur = que.top();que.pop();if(cur.x == ex && cur.y == ey) return cur.cnt;vis[cur.x][cur.y][cur.d] = true;memset(reach,false,sizeof(reach));if(cur.d == 0)dfs(cur.x+1,cur.y,cur.x,cur.y);else if(cur.d == 1)dfs(cur.x-1,cur.y,cur.x,cur.y);else if(cur.d == 2)dfs(cur.x,cur.y+1,cur.x,cur.y);else if(cur.d == 3)dfs(cur.x,cur.y-1,cur.x,cur.y);for(int i = 0; i < 4; i++){int newx = cur.x + dir[i][0];int newy = cur.y + dir[i][1];if(newx < 1 || newx > n || newy < 1 || newy > m) continue;if(map[newx][newy] == 1 || vis[newx][newy][i] == true) continue;next.x = newx, next.y = newy, next.cnt = cur.cnt+1, next.d = i;if(i == 0 && reach[cur.x+1][cur.y])que.push(next);else if(i == 1 && reach[cur.x-1][cur.y])que.push(next);else if(i == 2 && reach[cur.x][cur.y+1])que.push(next);else if(i == 3 && reach[cur.x][cur.y-1])que.push(next);}}return -1; }int main() {int t,tx,ty;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);for(int i = 1; i <= n; i++)for(int j = 1; j <= m; j++){scanf("%d",&map[i][j]);if(map[i][j] == 4)sx = i, sy = j;else if(map[i][j] == 3)ex = i, ey = j;else if(map[i][j] == 2)tx = i, ty = j;}printf("%d\n",bfs(tx,ty));}return 0; }

與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

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

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