[洛谷]P3395 路障 (BFS)

好一题路(zhi)障(狗头)

核心:

mp[zx[c-1]][zy[c-1]]=1;//要点,障碍降落,因为t是从0开始,所以要减1

ACcode:

#include<bits/stdc++.h>
using namespace std;
int n,zx[2000],zy[2000],k;
int xx[4]= {0,0,1,-1},yy[4]= {1,-1,0,0}; 
bool mp[1001][1001],vis[1001][1001],flag;

struct node {
	int x,y,t;//记录坐标和现在的时间
};
void bfs() {
	flag=0;
	queue<node>q;
	q.push({1,1,0});
	vis[1][1]=true;
	
	while(!q.empty()) {
		int a=q.front().x;
		int b=q.front().y;
		int c=q.front().t;//便于后面码代码
		q.pop();//出队
		
		if(a==n && b==n) {//到了终点
			flag=1;//改变标志
			break;//直接退出循环
		}
		
		mp[zx[c-1]][zy[c-1]]=1;//要点,障碍降落,因为t是从0开始,所以要减1
		for(int i=0; i<4; i++) { //枚举四个方向
			int dx=a+xx[i];
			int dy=b+yy[i];
			if(dx<1 || dx>n || dy<1 || dy>n || mp[dx][dy] || vis[dx][dy])continue; 
				vis[dx][dy]=1;
				q.push({dx,dy,c+1});//进入队列
		}
	}
	if(flag==1)//判断
		printf("Yes\n");
	else
		printf("No\n");
}
int main() {
	scanf("%d",&k);
	while(k--) {//一般是到0就结束
		scanf("%d",&n);
		memset(mp,0,sizeof(mp));//初始化!!
		memset(vis,0,sizeof(vis));
		flag=0;//看是否可以到达终点的标志
		for(int i=1; i<=2*n-2; i++) //输入障碍
			scanf("%d%d",&zx[i],&zy[i]);
		vis[1][1]=1;//起点肯定被访问了
		bfs();//广搜

	}
}

over~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值