好一题路(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~