AtCoder Beginner Contest 176 D - Wizard in Maze(01BFS)

原题链接

思路:

上题类似。
有两种走法,分别考虑代价:第一种花费的代价为 0 0 0,第二种花费的代价为 1 1 1.同时,第二种可以到达周围的点。
使用 01 b f s 01bfs 01bfs来计算,每次将第一种花费放入队头,第二种花费放入队尾。
细节:
1. 1. 1.第二种可以到达的周围的点里,只能到达 " . " "." "."的,也就是说原本就是可达的点。
2. 2. 2.对于每个点都有两种方案可以选择。

代码:

#include<bits/stdc++.h>
using namespace std;

int n,m,sx,sy,ex,ey;
char mp[1100][1100];
int nx[]={0,0,1,-1};
int ny[]={1,-1,0,0};
bool vis[1100][1100];
struct node{
	int x,y,step;
};

int bfs(){
	deque<node>q;
	q.push_front({sx,sy,0});
	while(!q.empty()){
		node t=q.front();q.pop_front();
		int x=t.x,y=t.y,step=t.step;
		if(vis[x][y]) continue;
		vis[x][y]=1;
		if(t.x==ex&&t.y==ey) return t.step;
		for(int k=0;k<4;k++){
			int xx=x+nx[k],yy=y+ny[k];
			if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&!vis[xx][yy]){
				if(mp[xx][yy]=='.') q.push_front({xx,yy,step});
			}
		}
		for(int i=-2;i<=2;i++)
			for(int j=-2;j<=2;j++){
				int n_x=x+i,n_y=y+j;
					if(n_x>=1&&n_x<=n&&n_y>=1&&n_y<=m&&!vis[n_x][n_y]&&mp[n_x][n_y]=='.'){
						q.push_back({n_x,n_y,step+1});
					}
			}
	}
	return -1;
}


int main(){
	cin>>n>>m>>sx>>sy>>ex>>ey;
	for(int i=1;i<=n;i++) cin>>mp[i]+1;
	cout<<bfs()<<endl;
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆沙睡不醒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值