題目 :https://vjudge.net/problem/UV...
很簡單的一道bfs
主要思考的點:
1.每次移動後是否出界node
2.所移動到的格子沒有被訪問過 或者 被訪問過而且此時移動到的格子越過障礙物的數目小於上一次通過此格子的障礙物的消耗c++
3.通過前一個格子時越過的障礙數小於給定的k 或者 等於k且要移動到的格子沒有障礙物ide
加粗的點是我沒有想到的
當k很大並且有不少障礙物組成一塊時就會出現這樣的狀況spa
具體能夠上題目連接中的uDebug裏找找樣例....net
最後附上代碼:code
#include<bits/stdc++.h> using namespace std; const int dx[] = {1, -1, 0, 0}; const int dy[] = {0, 0, 1, -1}; bool MAP[21][21]; int vis[21][21], obs[21][21]; struct node{ int x = 0, y = 0; node(int X = 0, int Y = 0){ x = X; y = Y; } }; bool inside(int x, int y, int m, int n){ return x >= 1 && x <= m && y >= 1 && y <= n; } void bfs(int m, int n, int k){ queue<node> que; node pre(1, 1), cur(0, 0); que.push(node(1, 1)); vis[1][1] = 0; while(!que.empty()){ pre = que.front(); que.pop(); if(pre.x == m && pre.y == n){ cout << vis[pre.x][pre.y] << "\n"; return; } for(int i = 0; i < 4; i++){ cur = node(pre.x + dx[i], pre.y + dy[i]); if(inside(cur.x, cur.y, m, n) && \ //#1 (obs[pre.x][pre.y] + 1 < obs[cur.x][cur.y] || vis[cur.x][cur.y] < 0) && \ //#2 (obs[pre.x][pre.y] < k || (obs[pre.x][pre.y] == k && !MAP[cur.x][cur.y])) //#3) { if(MAP[cur.x][cur.y]){ if(MAP[pre.x][pre.y]) obs[cur.x][cur.y] = obs[pre.x][pre.y] + 1; else obs[cur.x][cur.y] = 1; } vis[cur.x][cur.y] = vis[pre.x][pre.y] + 1; que.push(cur); } } } cout << "-1\n"; } int main() { int kase, m, n, k; cin >> kase; while(kase--){ memset(MAP, 0, false); memset(vis, -1, sizeof(vis)); memset(obs, 0, sizeof(obs)); cin >> m >> n >> k; for(int i = 1; i <= m; i++){ for(int j = 1; j <= n; j++){ cin >> MAP[i][j]; } } bfs(m, n, k); } }