信奥赛CSP-J复赛集训(bfs专题)(5):洛谷P3395:路障

news/2024/12/13 11:19:45/

信奥赛CSP-J复赛集训(bfs专题-刷题题单及题解)(5):洛谷P3395:路障

在这里插入图片描述

题目描述

B 君站在一个 n × n n\times n n×n 的棋盘上。最开始,B君站在 ( 1 , 1 ) (1,1) (1,1) 这个点,他要走到 ( n , n ) (n,n) (n,n) 这个点。

B 君每秒可以向上下左右的某个方向移动一格,但是很不妙,C 君打算阻止 B 君的计划。

每秒结束的时刻,C 君 会在 ( x , y ) (x,y) (x,y) 上摆一个路障。B 君不能走在路障上。

B 君拿到了 C 君准备在哪些点放置路障。所以现在你需要判断,B 君能否成功走到 ( n , n ) (n,n) (n,n)

保证数据足够弱:也就是说,无需考虑“走到某处然后被一个路障砸死”的情况,因为答案不会出现此类情况。

输入格式

首先是一个正整数 T T T,表示数据组数。

对于每一组数据:

第一行,一个正整数 n n n

接下来 2 n − 2 2n-2 2n2 行,每行两个正整数 x x x y y y,意义是在那一秒结束后, ( x , y ) (x,y) (x,y) 将被摆上路障。

输出格式

对于每一组数据,输出 YesNo,回答 B 君能否走到 ( n , n ) (n,n) (n,n)

样例 #1

样例输入 #1

22
1 1
2 25
3 3
3 2
3 1
1 2
1 3
1 4
1 5
2 2

样例输出 #1

Yes
Yes

提示

样例解释:

以下 0 表示能走,x 表示不能走,B 表示 B 君现在的位置。从左往右表示时间。

Case 1:
0 0    0 0    0 B  (已经走到了)
B 0    x B    x 0
Case 2:
0 0 0 0 0    0 0 0 0 0    0 0 0 0 0    0 0 0 0 0
0 0 0 0 0    0 0 0 0 0    0 0 0 0 0    0 0 0 0 0
0 0 0 0 0    0 0 x 0 0    0 0 x 0 0    0 0 x 0 0
0 0 0 0 0    0 0 0 0 0    0 0 x 0 0    0 0 x 0 0
B 0 0 0 0    0 B 0 0 0    0 0 B 0 0    0 0 x B 0 ......(B君可以走到终点)

数据规模:

防止骗分,数据保证全部手造。

对于 20 % 20\% 20% 的数据,有 n ≤ 3 n\le3 n3

对于 60 % 60\% 60% 的数据,有 n ≤ 500 n\le500 n500

对于 100 % 100\% 100% 的数据,有 n ≤ 1000 n\le1000 n1000

对于 100 % 100\% 100% 的数据,有 T ≤ 10 T\le10 T10

AC代码(100分)

#include<bits/stdc++.h>
using namespace std;
int T,n,x,y; 
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0}; 
//创建结构体:存储一个点的坐标 
struct point{int x,y;
}q[1000010],z[2000];//q数组用与广搜维护队列,z数组存放障碍点 
bool vis[1010][1010];//标记数组
bool f;//标记是否有结果//广搜
void bfs(){int head=1,tail=1,t=1;//t用于计时,当前是第1秒 q[head].x=1;//起点入队 q[head].y=1;vis[1][1]=1;//标记起点走过while(head<=tail){if(q[head].x==n && q[head].y==n){//判断是否到终点 f=1;//标记能出break;//退出循环 }for(int i=0;i<=3;i++){int nx=q[head].x+dx[i];int ny=q[head].y+dy[i];if(nx>=1 && nx<=n && ny>=1 && ny<=n && vis[nx][ny]==0){tail++;q[tail].x=nx;//新点入队 q[tail].y=ny;vis[nx][ny]=1;//标记新点 }}//1秒过后,放入障碍点vis[z[t].x][z[t].y]=1;t++;//模拟时间:下一秒head++;//队首出队 } } 
int main(){cin>>T;while(T--){cin>>n;//多组测试数据,一定要记得初始化数组和标记 memset(q,0,sizeof(q));memset(z,0,sizeof(z));memset(vis,0,sizeof(vis));f=0; //输入障碍点并存储到z数组中 for(int i=1;i<=2*n-2;i++){cin>>x>>y;z[i].x=x;//第i秒结束时所放路障的坐标 z[i].y=y; }//广搜 bfs(); //输出 if(f==1) cout<<"Yes"<<endl;else cout<<"No"<<endl; }return 0;
}

文末彩蛋:

点击王老师青少年编程主页有更多精彩内容


http://www.ppmy.cn/news/1554745.html

相关文章

OpenCV图片添加水印

函数效果图&#xff1a; 本来只有蓝色背景&#xff0c;这两个人物是水印添加上去的 原理&#xff1a; 本实验中添加水印的概念其实可以理解为将一张图片中的某个物体或者图案提取出来&#xff0c;然后叠加到另一张图片上。具体的操作思想是通过将原始图片转换成灰度图&#x…

软考-软件设计师-基础知识Chapter01-计算机系统

第一章 计算机系统 计算机系统基础知识 计算机系统硬件基本组成 计算器的基本硬件系统由运算器、控制器、存储器、输入设备、输出设备的5大部件组成。 中央处理单元 中央处理单元&#xff08;CPU&#xff09; 是计算机系统的核心部件&#xff0c;它负责获取程序指令、对指…

Java的Mvc整合Swagger的knife4框架

Swagger的介绍 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。使用Swagger&#xff0c;就是把相关的信息存储在它定义的描述文件里面&#xff08;yml或json格式&#xff09;&#xff0c;再通过维护这个描述 文件可以去更…

PyQt事件机制练习

一、思维导图 二、代码 import sysfrom PyQt6.QtTextToSpeech import QTextToSpeech from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QLineEdit from PyQt6 import uic from PyQt6.QtCore import Qt, QTimerEvent, QTimeclass MyWidget(QWidget):d…

linux内核驱动:pca954x i2c控制器扩展芯片驱动总结

目录 前言一、PCA9548芯片介绍二、驱动说明三、配置流程四、应用操作方式 前言 实际开发项目中可能需要多个i2c控制器对主控SOC芯片以外的i2c设备进行控制&#xff0c;当SOC的自带i2c控制器不够用时可以考虑使用控制器芯片进行扩展&#xff1b; 本笔记总结使用NXP的PCA9548进行…

计算机视觉中的数据增强:方法及其对精度提升的作用

计算机视觉中的数据增强&#xff1a;方法及其对精度提升的作用 随着计算机视觉&#xff08;Computer Vision, CV&#xff09;技术的迅速发展&#xff0c;模型在图像分类、目标检测、语义分割等任务上的表现越来越出色。然而&#xff0c;CV模型的表现高度依赖于训练数据的质量和…

论文浅尝 | SAC-KG:利用大语言模型作为领域知识图谱熟练的自动化构造器(ACL2024)...

笔记整理&#xff1a;杜超超&#xff0c;天津大学硕士&#xff0c;研究方向为自然语言处理、大语言模型 论文链接&#xff1a;https://aclanthology.org/2024.acl-long.238/ 发表会议&#xff1a;ACL 2024 1. 动机 知识图谱&#xff08;KG&#xff09;在各个专业领域的知识密集…

SQL中的函数介绍

大多数SQL实现支持以下类型 文本函数&#xff1a;用于处理文本字符串&#xff08;如删除或填充值&#xff0c;转换值为大写或小写&#xff09;。数值函数&#xff1a;用于在数值数据上进行算术操作&#xff08;如返回绝对值&#xff0c;进行代数运算&#xff09;。日期和时间函…