AtCoder Beginner Contest 213 E - Stronger Takahashi(01BFS)

原题链接

思路:

很容易想到 b f s bfs bfs的思路,实际上边权只有两种:
1. 1. 1.如果下一个点可以走,则边权为 0 0 0
2. 2. 2.如果下一个点不可以走,则边权为 1 1 1,同时周围的点也可以以同样的代价到达。
所以就考虑 01 b f s 01bfs 01bfs,每当有边权为 0 0 0的就插入队头,有边权为 1 1 1的就插入队尾,这样可以保证每次取出的都是最小的,保证队列的单调性跟算法的正确性。
细节的地方为选择一个不能走的点时,周围的同样代价的点如何确定。
最后,题解里推荐了个同类型的题目

代码:

struct node{
	int x,y,step;
};
char mp[510][510]; 
int n,m,vis[510][510];
int nx[]={1, 0, -1, 0};
int ny[]={0, 1, 0, -1};

int bfs(){
	deque<node>q;
	q.push_front({1,1,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(x==n&&y==m) return 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});
				else{
					for(int i=-1;i<=1;i++){
						for(int j=-1;j<=1;j++){
							int n_x=xx+i,n_y=yy+j;
							if(n_x>=1&&n_x<=n&&n_y>=1&&n_y<=m&&!vis[n_x][n_y]){
								q.push_back({n_x,n_y,step+1});
							}
						}
					}
				}
			}
		}
	}
	return -1;
}

int main(){
	n=read,m=read;
	rep(i,1,n) cin>>mp[i]+1;
	cout<<bfs()<<endl;	
	return 0;
} 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

豆沙睡不醒

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

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

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

打赏作者

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

抵扣说明:

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

余额充值