这题的难点是放置路障
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e3+10;
int t,n;
bool ok;
int a[maxn][maxn],f[maxn][maxn];
int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
int fx[maxn],fy[maxn];
struct node{
int x,y,k;
};
queue<node> q;
void dfs(int k,int x,int y){
node c;
c.x=x;c.y=y;c.k=k;
q.push(c);
a[x][y]=1;
while(!q.empty()){
node Top=q.front();q.pop();
f[fx[Top.k-1]][fy[Top.k-1]]=1;
if(Top.x==n&&Top.y==n){
ok=true;
break;
}
for(int i=0;i<4;i++){
int tx=Top.x+dx[i],ty=Top.y+dy[i];
if(tx>=1&&tx<=n&&ty>=1&&ty<=n&&!f[tx][ty]&&!a[tx][ty]){
node c;
c.x=tx;c.y=ty;c.k=Top.k+1;
q.push(c);
a[tx][ty]=1;
}
}
}
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
while(!q.empty())
q.pop();
memset(f,0,sizeof(f));
memset(a,0,sizeof(a));
ok=false;
for(int i=1;i<=2*n-2;i++){
int x,y;
scanf("%d%d",&x,&y);
fx[i]=x;fy[i]=y;
}
dfs(0,1,1);
if(ok)printf("Yes\n");
else printf("No\n");
}
}