题解 P3395 【路障】

Drug__Lover

2016-11-11 15:45:52

Solution

**先走再放路障** **第一个点是在到达终点之前就已经被放上了路障,所以不能走了** **纯纯的BFS** \_我用了一个vis数组来记录路障和判断是否已经走过(反正都不能走。。。)\_ ```cpp #include<iostream> #include<cstdio> #include<cstring> using namespace std; int t,n,k,sum; int x[1000001],y[1000001],vis[1001][1001]; int mx[5]={0,0,0,1,-1},my[5]={0,1,-1,0,0}; int fx[6000001],fy[1000001]; void bfs(int x1,int y1) { memset(vis,0,sizeof(vis)); k=0; sum=0; int h=0,t=1; vis[1][1]=1; fx[1]=x1; fy[1]=y1; while(h<t) { h++; for(int i=1;i<=4;i++) { vis[x[sum]][y[sum]]=1; if(x[sum]==n&&y[sum]==n) //如果在到达之前终点已经放上了路障,那就无法走到了,直接输出No就好了 { k=0; return; } int xx=fx[h]+mx[i],yy=fy[h]+my[i]; if(xx<=n&&xx>0&&yy<=n&&yy>0&&vis[xx][yy]==0) { t++; vis[xx][yy]=1; fx[t]=xx; fy[t]=yy; } } if(vis[n][n]==1) //如果终点已经走过并且不是路障那么就输出Yes { k=1; return; } sum++; } } int main() { cin>>t; for(int i=1;i<=t;i++) { cin>>n; for(int i=1;i<=2*n-2;i++) { cin>>x[i]>>y[i]; } bfs(1,1); if(k==1) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; } ```