myj的尘歌壶

Time Limit: 1000 MSMemory Limit: 262144 K
Total Submit: 380(54 users)Total Accepted: 76(42 users)Rating: Special Judge: No
Description

最近myj沉迷原神无法自拔,在原神的游戏系统中,有一个叫做尘歌壶的家园系统,你可以在里面放置各种物品

但是myj是一个急功近利的人,为了白嫖到奖励,不惜一切代价,而这一行为导致他的尘歌壶里面一片混乱

某一天,他在正常游戏的时候,发现自己在尘歌壶里面迷路了,而他发现他的尘歌壶可以转化为一个n*m的简单二维图,其中1表示障碍物,0表示空地。若你位于一格0上,那么你可以移动到相邻4格中的任意一格0上

现在myj给你他所在的位置,和他想去的位置,你能帮他找找是否存在一条路径使他在混乱的尘歌壶中走到目标位置吗?

Input

第一行一个数字T,表示有T组测试数据

对于每一组数据: 第一行包含两个整数n,m,表示myj给你的地图大小有n行m列

接下来有n行由01构成的字符串,每行字符串有m个字符,若当前字符为1,表示不可以通过。0表示可以正常通过

最后一行包含四个整数sx,sy,ex,ey,分别表示myj现在所在的点坐标,和终点的点坐标

n,m≤500,T≤10,数据保证起点和终点不是障碍物,且对于所有数据而言,n*m的总和不大于1e7

Output

如果myj能够顺利到达,输出YE5

否者输出N0

Sample Input

3 3
001
100
110
1 1 3 3
Sample Output
YE5
Hint

输出建议直接复制题目

每输出一行都应该有一个换行符

行末没有多余空格

迷宫左上角坐标为(1,1),右下角为(n,m)

提示:可以参考马老师讲过的走迷宫代码,注意复杂度!

Source
20211016
Author
马英杰
#include <iostream>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;

constexpr int N=505;
char s[N][N];
int z,n,m,sx,sy,ex,ey;
bool vis[N][N];
int dx[4]={0,1,-1,0},dy[4]={1,0,0,-1};

void bfs(int x,int y){
    queue<pair<int,int>>q;
    q.push(make_pair(x,y));
    while(!q.empty()){
        auto t=q.front();
        q.pop();
        if(t.first==ex&&t.second==ey){
            printf("YE5\n");
            return;
        }
        for(int i=0;i<4;i++){
            int xx=t.first+dx[i],yy=t.second+dy[i];
            if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&vis[xx][yy]==0&&s[xx][yy]=='0'){
                vis[xx][yy]= true;
                q.push(make_pair(xx,yy));
            }
        }
    }
    printf("N0\n");
    return;
}
int main() {
    scanf("%d", &z);
    while (z--) {
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
               cin>>s[i][j];
            }
        }
        scanf("%d%d%d%d", &sx, &sy, &ex, &ey);
        s[sx][sy]= true;
        bfs(sx, sy);
        memset(s,0,sizeof(s));
        memset(vis, false,sizeof(vis));
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
给这段代码加上注释 //计算AGV矩形轮廓路径 计算角点:利用车头正方向的夹角差值计算车的四个角度 QPainterPath path; double carWidth =m_para.width; double carLength =m_para.length; double carAngle =m_attri->angle/100; double angle = atan((carWidth)/(carLength));//夹角差值 double length = sqrt(pow(carWidth,2)+pow(carLength,2))/2;//对角线长度的一半 //计算AGV外接矩形轮廓路径 /m_boundPath //矩形的四个顶点存储在m_agvRectPoints中,绘制AGV锁定区域需要用到m_agvRectPoints QPointF pointRT = calLinePath(path,length,carAnglePI/180+angle,true);//右上角 m_agvRectPoints[0]=pointRT; QPointF pointRB = calLinePath(path,length,carAnglePI/180-angle);//右下角--头 m_agvRectPoints[1]=pointRB; QPointF pointLB = calLinePath(path,length,carAnglePI/180+angle+PI);//左下角--尾 m_agvRectPoints[2]=pointLB; QPointF pointLT = calLinePath(path,length,carAnglePI/180-angle+PI);//左上角--尾 m_agvRectPoints[3]=pointLT; path.closeSubpath(); m_path = path; //计算AGV锁定矩形轮廓路径 /m_trackPath QPainterPath trackPath; double tracklength = sqrt(pow(carWidth+carWidth/2.0,2)+pow(carLength+carLength/2.0,2))/2;//对角线长度的一半 //agv锁定矩形随agv旋转 --MYJ 2021.12.14 calLinePath(trackPath, tracklength, -(carAnglePI / 180 + angle), true);//右上角 calLinePath(trackPath, tracklength, -(carAnglePI / 180 - angle));//右下角--头 calLinePath(trackPath, tracklength, -(carAnglePI / 180 + angle + PI));//左下角--尾 calLinePath(trackPath, tracklength, -(carAnglePI / 180 - angle + PI));//左上角--尾 trackPath.closeSubpath(); m_boundaryPath = trackPath;
06-13
//计算AGV矩形轮廓路径 //计算角点:利用车头正方向的夹角差值计算车的四个角度 QPainterPath path; //定义画笔路径对象 double carWidth = m_para.width; //获取AGV宽度 double carLength = m_para.length; //获取AGV长度 double carAngle = m_attri->angle / 100; //获取AGV车头角度 double angle = atan((carWidth) / (carLength)); //计算夹角差值 double length = sqrt(pow(carWidth, 2) + pow(carLength, 2)) / 2; //计算对角线长度的一半 //计算AGV外接矩形轮廓路径 /m_boundPath //矩形的四个顶点存储在m_agvRectPoints中,绘制AGV锁定区域需要用到m_agvRectPoints QPointF pointRT = calLinePath(path, length, carAngle * PI / 180 + angle, true); //计算右上角点 m_agvRectPoints[0] = pointRT; //存储右上角点 QPointF pointRB = calLinePath(path, length, carAngle * PI / 180 - angle); //计算右下角点(车头) m_agvRectPoints[1] = pointRB; //存储右下角点(车头) QPointF pointLB = calLinePath(path, length, carAngle * PI / 180 + angle + PI); //计算左下角点(车尾) m_agvRectPoints[2] = pointLB; //存储左下角点(车尾) QPointF pointLT = calLinePath(path, length, carAngle * PI / 180 - angle + PI); //计算左上角点(车尾) m_agvRectPoints[3] = pointLT; //存储左上角点(车尾) path.closeSubpath(); //闭合路径 m_path = path; //存储路径 //计算AGV锁定矩形轮廓路径 /m_trackPath QPainterPath trackPath; //定义画笔路径对象 double tracklength = sqrt(pow(carWidth + carWidth / 2.0, 2) + pow(carLength + carLength / 2.0, 2)) / 2; //计算对角线长度的一半 //agv锁定矩形随agv旋转 --MYJ 2021.12.14 calLinePath(trackPath, tracklength, -(carAngle * PI / 180 + angle), true); //计算右上角点 calLinePath(trackPath, tracklength, -(carAngle * PI / 180 - angle)); //计算右下角点(车头) calLinePath(trackPath, tracklength, -(carAngle * PI / 180 + angle + PI)); //计算左下角点(车尾) calLinePath(trackPath, tracklength, -(carAngle * PI / 180 - angle + PI)); //计算左上角点(车尾) trackPath.closeSubpath(); //闭合路径 m_boundaryPath = trackPath; //存储路径

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

q619718

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值