hdu1072 逃離迷宮系列 bfs

2022-05-20 12:13:12 字數 1549 閱讀 7348

題意:逃離迷宮,路中可能有炸彈,總時間是6個單位,在有炸彈的位置,如果到達的時刻時間大於0,則恢復到6時間,炸彈的位置可以重複到達,求出最終至少需要多少步才能走出迷宮,到達終點。這樣的最優化問題和地圖相關的,bfs應該足以解決。我們考慮到乙個位置可能被多次訪問,所以狀態引數應該設定乙個時間,設定為訪問時的剩餘時間,因為如果乙個位置第一次訪問時剩餘時間是t,則下一次訪問時如果剩餘時間還是t的話,走的步數一定比第一次訪問時大,不可能是最優解,這也是一種剪枝。要注意每次時間狀態更新時都要判斷這個狀態在已經搜尋過的狀態空間中是否存在。其次,判斷狀態不可到達的條件較多,在cur->nxt兩種狀態切換之間需要把所有的狀態變化先列舉出來。

**如下:

1 #include2

using

namespace

std;

3 typedef unsigned int

ui;4 typedef long

long

ll;5 typedef unsigned long

long

ull;

6#define pf printf

7#define mem(a,b) memset(a,b,sizeof(a))

8#define prime1 1e9+7

9#define prime2 1e9+9

10#define pi 3.14159265

11#define lson l,mid,rt<<1

12#define rson mid+1,r,rt<<1|1

13#define scand(x) scanf("%llf",&x)

14#define f(i,a,b) for(int i=a;i<=b;i++)

15#define scan(a) scanf("%d",&a)

16#define dbg(args) cout<<#args<<":"<17

#define inf 0x3f3f3f3f

18#define maxn 105

19int

n,m,t,sx,sy,tx,ty;

20int

map[maxn][maxn];

21int dir[2]=;

22struct

node;

25bool

vis[maxn][maxn][maxn];

26//

還需要考慮到走出迷宮的時間,所以乙個位置可能在不同的時間被走到

27//

第一次在剩餘t時間走到(i,j)位置時step一定最小

28node cur,nxt;

29int

bfs()

3045 f(i,0,3)46

62 vis[nxt.x][nxt.y][nxt.time]=1;63

q.push(nxt);64}

65}66return -1;67

}68intmain()

6988 pf("

%d\n

",bfs());89}

90 }

HDU 1072 記憶化搜 DFS BFS

題目大意 0為牆1為路2為起點3為終點4為炸彈 走到任意乙個炸彈都可以將所有炸彈重置倒計時6minutes 每走乙個位置需要1minutes 問從2到3需要的最少時間 dfs法更快。bfs法好理解。思路 兩種方法都需理解一點 同乙個炸彈位置當第二次走到時說明已不是最優解。bfs法 處理走到同乙個炸彈...

hdu 逃離迷宮 BFS

給定乙個m n m行,n列 的迷宮,迷宮中有兩個位置,gloria想從迷宮的乙個位置走到另外乙個位置,當然迷宮中有些地方是空地,gloria可以穿越,有些地方是障礙,她必須繞行,從迷宮的乙個位置,只能走到與它相鄰的4個位置中,當然在行走過程中,gloria不能走到迷宮外面去。令人頭痛的是,glori...

HDU 1278 逃離迷宮

hdu 1278 逃離迷宮 不好想,參考別的 寫的,題目要求轉彎的次數不能超過k,bfs,從乙個方向搜到底 include include include include includeusing namespace std int n1,n2,k char map 105 105 int visi...