蓝桥杯:AB路线——BFS+分层图(三维BFS)

 思想:

因为一个点可能不止走一次,所以说二维的BFS会超时,但如果变成三维的情况,每当第一次走到三维数组的第一次,就是最短的那个结果,将三维的情况和二维BFS一样变成不可搜索的,并且在搜索过程中,可以根据奇偶来划分下一次是走A还是B,第三维代表的是这个点走的A/B是第几个,整个数组存的是多少点的个数,最后减一是因为结果是步数为点数减一

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;

const int N = 1010;

int g[N][N];
int dis[N][N][20];
bool st[N][N][20];
int n,m,k;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};

bool check(int x,int y){
	return x>=0&&y>=0&&x<n&&y<m;
}

int bfs(){
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			for(int p=0;p<k;p++){
				dis[i][j][p]=INF;
			}
		}
	}
	queue<array<int,3>> q;
	q.push({0,0,1});
	dis[0][0][1]=1;
	st[0][0][1]=true;
	while(q.size()){
		auto t=q.front();
		q.pop();
		int xx=t[0];
		int yy=t[1];
		int c=t[2];
		int d=dis[xx][yy][c];
		for(int i=0;i<4;i++){
			int nx=xx+dx[i];
			int ny=yy+dy[i];
			int dd=(d/k)%2;
			if(check(nx,ny)&&g[nx][ny]==dd&&!st[nx][ny][(d+1)%k]){
				st[nx][ny][(d+1)%k]=true;
				dis[nx][ny][(d+1)%k]=d+1;
				q.push({nx,ny,(d+1)%k});
			}
		}
	}
	int cnt=INF;
	for(int i=0;i<k;i++){
		cnt=min(cnt,dis[n-1][m-1][i]);
	}
	return cnt;
}


int main()
{
	cin >> n >> m >> k;
	for(int i=0;i<n;i++){
		string s;
		cin >> s;
		for(int j=0;j<m;j++){
			g[i][j]=(s[j]!='A');
		}
	}
	int res=bfs();
	if(res!=INF){
		cout << res-1;
	}
	else{
		cout << -1;
	}
}

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值