题目大意:
第一行输入t表示有t组数据。
第二行输入n,r : n表示n*n的图,r表示右转灯个数。
接着输入r个右转灯坐标。
最后输入开始位置:
(0,y)对应(1,y),向E;(n+1,y)对应(n,y),向W;
(x,0)对应(x,1),向N;(x,n+1)对应(x,n),向S。
思路:
自己想的是存好坐标然后用map存好各点坐标然后就写了一长段代码还过不了……迷失在WA………现在是解决不了唉希望以后能解决………
然后其实有很简单的模拟方法。
图存个二维数组,然后建个三维数组记一下各个方向走过没有。
注意这个方向要记来的而不能记要去的。因为第一个出发点其实也可能有右转灯。并且出发的时候是还没有走过的。
//poj2766模拟
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int dx[4]={1,0,-1,0};
int dy[4]={0,-1,0,1};
int n,edx,edy;
int grid[55][55];
bool vis[55][55][4];
bool canfind(int stx,int sty,int dir)
{
int nx,ny;
bool ok=true;
nx=stx,ny=sty;
while(ok)//x,y从哪个方向来
{
if(vis[nx][ny][dir])
return false;
vis[nx][ny][dir]=true;
if(grid[nx][ny])
dir=(dir+1)%4;
nx+=dx[dir];
ny+=dy[dir];
if(nx==n+1||nx==0||ny==n+1||ny==0)
{
edx=nx,edy=ny;
return true;
}
}
}
int main()
{
int t,r,x,y;
int stx,sty,dir;
cin>>t;
while(t--)
{
cin>>n>>r;
memset(grid,0,sizeof(grid));
memset(vis,0,sizeof(vis));
while(r--)
{
cin>>x>>y;
grid[x][y]++;
}
cin>>stx>>sty;
if(stx==0)
{
stx=1,dir=0;
}
else if(sty==n+1)
{
sty=n,dir=1;
}
else if(stx==n+1)
{
stx=n,dir=2;
}
else if(sty==0)
{
sty=1,dir=3;
}
if(canfind(stx,sty,dir))
printf("%d %d\n",edx,edy);
else printf("0 0\n");
}
return 0;
}
//poj2766 map+set
#include <iostream>
#include <cstring>
#include <cstdio>
#include <map>
#include <set>
using namespace std;
int n,edx,edy;
bool visited[55][55][4];
map <int, set<int> >x;
map <int, set<int> >y;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
//0N,1E,2S,3W
bool start(int a,int b,int dir)
{
set<int>::iterator iter;
map <int, set<int> >::iterator it;
int next;
if(dir==0)//N
{
//整列x=a无灯
it=x.find(a);
if(it==x.end())
{
edx=a,edy=n+1;
return true;
}
iter=x[a].upper_bound(b);
//N方向无灯
if(iter==x[a].end())
{
edx=a,edy=n+1;
return true;
}
//N方向有灯
next=*iter;
if(visited[a][next][0])return false;
visited[a][next][0]=true;
//转E
return start(a,next,1);
}
else if(dir==1)//E
{
//整行y=b无灯
it=y.find(b);
if(it==y.end())
{
edx=n+1,edy=b;
return true;
}
iter=y[b].upper_bound(a);
//E方向无灯
if(iter==y[b].end())
{
edx=n+1,edy=b;
return true;
}
//E方向有灯
next=*iter;
if(visited[next][b][1])return false;
visited[next][b][1]=true;
//转S
return start(next,b,2);
}
if(dir==2)//S
{
//整行x=a无灯
it=x.find(a);
if(it==x.end())
{
edx=a,edy=0;
return true;
}
iter=x[a].lower_bound(b);
//S方向无灯
if(iter==x[a].begin())
{
edx=a,edy=0;
return true;
}
//S方向有灯
iter--;
next=*iter;
if(visited[a][next][2])return false;
visited[a][next][2]=true;
//转W
return start(a,next,3);
}
else if(dir==3)//W
{
//整行y=b无灯
it=y.find(b);
if(it==y.end())
{
edx=0,edy=b;
return true;
}
iter=y[b].lower_bound(a);
//W方向无灯
if(iter==y[b].begin())
{
edx=0,edy=b;
return true;
}
//W方向有灯
iter--;
next=*iter;
if(visited[next][b][3])return false;
visited[next][b][3]=true;
//转N
return start(next,b,0);
}
}
int main()
{
int i,t,r,a,b,stx,sty,dir;
bool flag;
cin>>t;
while(t--)
{
cin>>n>>r;
x.clear();
y.clear();
for(i=0;i<r;i++)
{
scanf("%d%d",&a,&b);
x[a].insert(b);
y[b].insert(a);
}
scanf("%d%d",&stx,&sty);
if(stx==0)
{
stx=1;dir=1;//E
}
else if(stx==n+1)
{
stx=n;dir=3;//W
}
else if(sty==0)
{
sty=1;dir=0;//N
}
else if(sty==n+1)
{
sty=n;dir=2;//S
}
memset(visited,0,sizeof(visited));
if(start(stx,sty,dir))
cout<<edx<<' '<<edy<<endl;
else
cout<<0<<' '<<0<<endl;
}
return 0;
}