题目 :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); } }