标签:模拟
一般的模拟题。对于出现过的每一个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;
}scu oj 4445 Right turn 2015年四川省赛J题(模拟题)
标签:模拟
原文地址:http://blog.csdn.net/u012127882/article/details/46505851