1 条题解
-
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
- 上传者