scu oj 4445 Right turn 2015年四川省赛J题(模拟题)

一般的模拟题。对于出现过的每一个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;}elsevis[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++;}elsebreak;}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++;}elsebreak;}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++;}elsebreak;}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++;}elsebreak;}}if(!fg)puts("-1");elseprintf("%d\n",cnt);}return 0;}

可以一个人,可以几个人,一起放松那劳累的心情或者劳累自己的身体,

scu oj 4445 Right turn 2015年四川省赛J题(模拟题)

相关文章:

你感兴趣的文章:

标签云: