1 条题解

  • 0

    题意分析

    1. 棋盘与装置
      • n×nn \times n网格,部分格点放置右转器
      • 右转器功能:使入射光束向右偏转9090
    2. 激光发射规则
      • 从边界发射,方向由位置决定(北/南/东/西)
    3. 输出要求
      • 追踪光束路径直至离开棋盘或被捕获

    解题思路

    1. 方向表示
      • 定义四个移动方向(北、东、南、西)及其坐标变化规则
    2. 路径模拟
      • 从起始点按初始方向移动
      • 遇到右转器时改变方向(右转9090度)
      • 重复直至越界或进入循环

    实现步骤

    1. 初始化棋盘
      • 用二维数组标记右转器位置
    2. 确定初始方向
      • 根据激光器位置计算初始移动方向
    3. 光束追踪
      • 按当前方向移动,检查是否遇到右转器
      • 更新方向并记录访问状态以防循环
    4. 终止判断
      • 当坐标超出[1,n][1,n]范围时输出边界坐标
      • 若进入循环则输出0 00\ 0

    代码实现

    #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;
    }
    • 1

    信息

    ID
    1766
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者