POJ 2766 laserbox 模拟还有过不了的map+set

题目大意:
第一行输入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;
} 
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可 6私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值