习题6-5(uva-1600)

该程序实现了一个迷宫求解器,通过广度优先搜索(BFS)策略寻找从起点到终点的最短路径。输入包括迷宫的行数、列数和障碍物数量,然后逐一读取每个位置的状态。当找到终点时,输出步数;若无法到达终点,则输出-1。程序使用了标准库中的数据结构和算法,如队列、矩阵和位运算,有效展示了C++在路径查找问题上的应用。
摘要由CSDN通过智能技术生成
#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值