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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

P2802 回家(dfs+三维数组标记+剪枝)

發布時間:2023/12/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P2802 回家(dfs+三维数组标记+剪枝) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述 小H在一個劃分成了n* m個方格的長方形封鎖線上。 每次他能向上下左右四個方向移動一格(當然小H不可以靜止不動), 但不能離開封鎖線,否則就被打死了。 剛開始時他有滿血6點,每移動一格他要消耗1點血量。一旦小H的 血量降到 0, 他將死去。 他可以沿路通過拾取鼠標(什么鬼。。。)來補滿血量。只要他走到有鼠標的格子,他不需要任何時間即可拾取。格子上的鼠標可以瞬間補滿,所以每次經過這個格子都有鼠標。就算到了某個有鼠標的格子才死去, 他也不能通過拾取鼠標補滿 HP。 即使在家門口死去, 他也不能算完成任務回到家中。
地圖上有 5 種格子:
數字 0: 障礙物。
數字 1: 空地, 小H可以自由行走。
數字 2: 小H出發點, 也是一片空地。
數字 3: 小H的家。
數字 4: 有鼠標在上面的空地。
小H能否安全回家?如果能, 最短需要多長時間呢?
輸入格式 第一行兩個整數n,m, 表示地圖的大小為n*m。
下面 n 行, 每行 m 個數字來描述地圖。
輸出格式 一行, 若小H不能回家, 輸出-1,否則輸出他回家所需最短時間。
輸入輸出樣例 輸入 #1
復制
3 3
2 1 1
1 1 0
1 1 3
輸出
#1
復制
4
說明/提示 1<=n,m<=9
思路:dfs挺不錯的一道題目。一開始看數據量會發現很小,但是如果不仔細看的話,會出現很多錯誤。首先要注意剪枝,如果說當前步數已經大于等于當前的最小值了,就不需要往下走了,因為再走也是枉然。其次就是每一個格子都有可能再次走到,但是走到的時候,能量值是不一樣的。因此在標記的時候需要開一個三維數組進行標記。
代碼如下:

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m; const int N = 11; int sx,sy,ex,ey; int g[N][N]; bool st[N][N][7]; int flag = 0; int res = 0x3f3f3f3f; int nex[4][2] = {{1,0},{0,1},{-1,0},{0,-1}}; void dfs(int x,int y,int health,int step) {if(health==0) return;if(step>=res) return ; if(g[x][y]==3) {res = min(res,step);flag = 1;return;}if(g[x][y]==4) health=6;for(int i=0;i<4;i++){int tx = x+nex[i][0];int ty = y+nex[i][1];if(tx<1||tx>n||ty<1||ty>m||st[tx][ty][health-1]) continue;if(!g[tx][ty]) continue;st[tx][ty][health-1]=1;dfs(tx,ty,health-1,step+1);st[tx][ty][health-1]=0;} } int main() {cin>>n>>m;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>g[i][j];for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){if(g[i][j]==2){sx = i;sy = j;}if(g[i][j]==3){ex = i;ey = j;}}st[sx][sy][6]=true;dfs(sx,sy,6,0);if(res==0x3f3f3f3f) printf("-1");else printf("%d",res);return 0; }

努力加油a啊

總結

以上是生活随笔為你收集整理的P2802 回家(dfs+三维数组标记+剪枝)的全部內容,希望文章能夠幫你解決所遇到的問題。

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