#include <iostream>
#include <istream>
#include <sstream>
#include <vector>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <cstring>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <numeric>
#include <chrono>
#include <ctime>
#include <cmath>
#include <cctype>
#include <string>
#include <cstdio>
#include <iomanip>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <iterator>
using namespace std;
int matrix[25][25],vis[25][25][25], n, r, c, k;
const int dirs[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
int main()
{
cin >> n;
while (n--) {
cin >> r >> c >> k;
for (int i = 1; i <= r; ++i) {
for (int j = 1; j <= c; ++j) {
cin >> matrix[i][j];
}
}
memset(vis, 0, sizeof(vis));
queue<int> q;
q.push(1); q.push(1); q.push(0);
vis[1][1][0] = 1;
int len = 0,cnt = 0,isok = 0;
while (!isok && !q.empty()) {
len = q.size() / 3;
for (int i = 0; i < len; ++i) {
int x = q.front(); q.pop();
int y = q.front(); q.pop();
int t = q.front(); q.pop();
if (x == r && y == c) {
isok = 1;
break;
}
for (int j = 0; j < 4; ++j) {
int nx = x + dirs[j][0];
int ny = y + dirs[j][1];
if(nx <= 0 || nx > r || ny <= 0 || ny > c) continue;
if (matrix[nx][ny] == 0 && !vis[nx][ny][0]) { vis[nx][ny][0] = 1; q.push(nx); q.push(ny); q.push(0); }
else if(matrix[nx][ny] == 1 && t + 1 <= k && !vis[nx][ny][t+1]){
q.push(nx);
q.push(ny);
q.push(t + 1);
vis[nx][ny][t+1] = 1;
}
}
}
if(isok)break;
++cnt;
}
if (isok)
cout << cnt << endl;
else
cout << -1 << endl;
}
return 0;
}
习题6-5(uva-1600)
最新推荐文章于 2021-05-20 14:33:09 发布
该程序实现了一个迷宫求解器,通过广度优先搜索(BFS)策略寻找从起点到终点的最短路径。输入包括迷宫的行数、列数和障碍物数量,然后逐一读取每个位置的状态。当找到终点时,输出步数;若无法到达终点,则输出-1。程序使用了标准库中的数据结构和算法,如队列、矩阵和位运算,有效展示了C++在路径查找问题上的应用。
摘要由CSDN通过智能技术生成