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