关于第X篇题解
  • 板块P3395 路障
  • 楼主Atserckcn
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/12/11 21:31
  • 上次更新2024/12/12 15:56:25
查看原帖
关于第X篇题解
1065071
Atserckcn楼主2024/12/11 21:31

题解原代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<stack>
using namespace std;
int n,zx[2000],zy[2000],k,xx[4]={0,0,1,-1},yy[4]={1,-1,0,0};//n是矩阵的大小,zx,zy是障碍的坐标,k是数据组数,xx,yy是四个移动方向 
bool map[1001][1001],vis[1001][1001],flag;//map是地图,vis看是否被访问,flag看是否可以到达 
struct node
{
	int x,y,t;//记录坐标和现在的时间 
};
void bfs(int x,int y,int t)
{
	queue<node>q;//我喜欢用STL的队列,不喜欢手动模拟的,因为我懒啊 
	node now,net;
	now.x=x;now.y=y;now.t=t;
	q.push(now);
	while(!q.empty()) {
		now=q.front();//取出队头元素 
		q.pop();//出队 
		int a=now.x;int b=now.y;int c=now.t;//便于后面码代码 
		if(a==n && b==n) {//到了终点 
			flag=1;//改变标志 
			break;//直接退出循环 
		}
		map[zx[now.t-1]][zy[now.t-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 && map[dx][dy]==0 && vis[dx][dy]==0) {//在矩阵中,无障碍,无访问 
				net.x=dx;net.y=dy;net.t=c+1;//时间加加 
				vis[dx][dy]=1;
				q.push(net);//进入队列 
			}
		}
	}
}
int main()
{
	scanf("%d",&k);
	while(k--) {//一般是到0就结束
		scanf("%d",&n);
		memset(map,0,sizeof(map));//初始化!! 
		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(1,1,0);//广搜 
		if(flag==1)//判断 
			printf("Yes\n");
		else
			printf("No\n");
	}
}

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

中,蒟蒻不懂,第一次的now.t-1 明明是-1,为什么不会RE呢?

2024/12/11 21:31
加载中...