蓝桥杯真题--AB路线

#include<bits/stdc++.h>
using namespace std;
//思路:四方向搜索
//没有提到不能反复走,但是仍需标记不然会超时
//我一开始并没有想到要标记,我想的是通过限制总的循环次数避免死循环,但这样显然是不对的
//在常规的dfs或者bfs时,我们通过标记确保不重复访问,是对于每个点来说,当再次走到这个点时我们会面临同样的
//选择,这是一维的,这个题是k维的。对于同一个点不会是仅有一种情况,可能是第1-k步走到这个点,当我们在相同
//的情况下再走到这个点时,我们会面临相同的选择。一维只有一种情况
int dx[4] = { 0,0,1,-1 };
int dy[4] = { 1,-1,0,0 };
int main() {
	int n, m, k;
	cin >> n >> m >> k;
	vector<vector<char>>graph(n, vector<char>(m));
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> graph[i][j];
		}
	}
	vector<vector<vector<bool>>>isvis(n, vector<vector<bool>>(m, vector<bool>(k + 1)));
	queue<tuple<int, int, int,int>>q;//存储坐标,第个格子,当前步数
	q.push({ 0,0,1,0});
	int ans = -1;
	while (!q.empty()) {
		int x = get<0>(q.front()),y=get<1>(q.front()),t=get<2>(q.front()),step=get<3>(q.front());
		q.pop();
		if (x == n - 1 && y == m - 1) {
			ans = step;
			break;
		}
		for (int i = 0; i < 4; i++) {
			int nx = x + dx[i], ny = y + dy[i];
			if (nx >= 0 && nx < n && ny >= 0 && ny < m) {
				if (t == k && graph[x][y] != graph[nx][ny] && isvis[nx][ny][1] == false) {//需要换字母
					q.push({ nx,ny,1,step + 1 });
					isvis[nx][ny][1] = true;
				}
				else if (t < k && graph[x][y] == graph[nx][ny] && isvis[nx][ny][t + 1] == false) {
					q.push({ nx,ny,t + 1,step + 1 });
					isvis[nx][ny][t + 1] = true;
				}
			}
		}
	}
	cout << ans;
	return 0;
}

确实有进步哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值