一般的模拟题。对于出现过的每一个x建立一个set 集合,对于y也如此。然后查找要走到哪个点即可,主要要对状态记录,判断是否无线循环,否者出现无线循环的情况,就tle了。
#include<stdio.h> #include<string.h> #include<iostream> #include<string> #include<queue> #include<cmath> #include<map> #include<algorithm> #include<vector> #include<set> using namespace std; const int mmax = 500010; const int inf=0x3fffffff; struct node { int x,y; void read() { scanf("%d %d",&x,&y); } node(int x,int y):x(x),y(y) {} node() {} bool operator < (const node &a) const { if(x==a.x) return y<a.y; return x<a.x; } }P[2100]; map<int,int>qx,qy; set<int> Sx[2100],Sy[2100]; int dir[4][2]={1,0,0,-1,-1,0,0,1}; map<node,int>q; bool vis[10100][4]; bool fuck(int x,int y) { int cnt=0; for(int i=0;i<4;i++) { int tx=x+dir[i][0]; int ty=y+dir[i][1]; // if(x==0 && y==0) // { // cout<<tx<<" "<<ty<<endl; // } if(qx.count(tx) && Sx[qx[tx]].count(ty)) { //cout<<tx<<" "<<ty<<endl; cnt++; } } //cout<<"fuck"<<endl; return cnt==4; } int main() { int n; while(~scanf("%d",&n)) { qx.clear(); qy.clear(); for(int i=0;i<1100;i++) Sx[i].clear(),Sy[i].clear(); int cntx=0,cnty=0; for(int i=0;i<n;i++) { P[i].read(); if(!qx.count(P[i].x)) qx[P[i].x]=cntx++; if(!qy.count(P[i].y)) qy[P[i].y]=cnty++; Sx[ qx[P[i].x] ].insert(P[i].y); Sy[ qy[P[i].y] ].insert(P[i].x); //if(P[i].x==1 && P[i].y==0) //cout<<qx [1]<<endl; //cout<<Sx[0].count(0)<<endl; } //cout<<qx[1]<<endl; //cout<<"fuck"<<endl; int nowx=0,nowy=0,nowdir=0; q.clear(); int cc=0; int cnt=0; bool fg=1; memset(vis,0,sizeof vis); while(1) { //cout<<nowx<<" "<<nowy<<" "<<nowdir<<endl; if(!q.count(node(nowx,nowy))) q[node(nowx,nowy)]=cc++; if(vis[q[node(nowx,nowy)]][nowdir]) { fg=0; break; } else vis[q[node(nowx,nowy)]][nowdir]=1; if(nowdir==0) { if(!qy.count(nowy)) break; set<int>::iterator it; if(fuck(nowx,nowy)) { fg=0; break; } it=Sy[ qy[nowy] ].upper_bound(nowx); if(it!=Sy[ qy[nowy] ].end()) { int tx=*it; tx--; nowx=tx; nowdir++; nowdir%=4; cnt++; } else break; } else if(nowdir==1) { if(!qx.count(nowx)) break; set<int>::iterator it; if(fuck(nowx,nowy)) { fg=0; break; } it=Sx[ qx[nowx] ].lower_bound(nowy); if(it!=Sx[ qx[nowx] ].begin()) { it--; int ty=*it; ty++; nowy=ty; nowdir++; nowdir%=4; cnt++; } else break; } else if(nowdir==2) { if(!qy.count(nowy)) break; set<int>::iterator it; if(fuck(nowx,nowy)) { fg=0; break; } it=Sy[ qy[nowy] ].lower_bound(nowx); if(it!=Sy[ qy[nowy] ].begin()) { it--; int tx=*it; tx++; nowx=tx; nowdir++; nowdir%=4; cnt++; } else break; } else if(nowdir==3) { if(!qx.count(nowx)) break; set<int>::iterator it; if(fuck(nowx,nowy)) { fg=0; break; } it=Sx[ qx[nowx] ].upper_bound(nowy); if(it!=Sx[ qx[nowx] ].end()) { int ty=*it; ty--; nowy=ty; nowdir++; nowdir%=4; cnt++; } else break; } } if(!fg) puts("-1"); else printf("%d\n",cnt); } return 0; }
时间: 2024-10-10 00:42:23