P1649 Obstacle Course S(dfs卡方向数组/bfs)

传送门icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P1649

开始拿到题,发现数据范围是100,于是我尝试用dfs一做,写完后发现是90分,TLE一个点。于是乎观看题解(我还以为能剪枝掉),发现改一下遍历方向就能过了(我认为是数据不好)

大概是有其他的优化方法的(

dfs代码(90分/100分)

// Problem: 
//     P1649 [USACO07OCT] Obstacle Course S
//   
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1649
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include<iostream>
using namespace std;
const int N=105;
int n;
char a[N][N];
int vis[N][N];
int sx,sy,ex,ey;
int minn=1e9;
int dx[4]={1,0,-1,0};
int dy[4]={0,-1,0,1};//这个方向很奇妙,其他方向就过不了,大概率应该是数据问题
//下  左 上 右
int pre[N][N];//某一步走的是什么,我最开始没想到不能往回走的因素,所以说,只需要判断这个和前面的一个相等不相等即可....这里的pre数组且一看吧
bool check;void dfs(int xx,int yy,int k){//现在在某一个位置if(xx==ex&&yy==ey){minn=min(minn,k);check=true;return;//结束}if(k>=minn) return;//剪枝for(int i=0;i<4;++i){int x=xx+dx[i];int y=yy+dy[i];if(x>n||x<1||y<1||y>n||vis[x][y]) continue;vis[x][y]=1;if(xx==sx&&yy==sy) pre[x][y]=i,dfs(x,y,k);else{if(pre[xx][yy]==0||pre[xx][yy]==2){if(i==0||i==2) pre[x][y]=i,dfs(x,y,k);else {if(k<minn) pre[x][y]=i,dfs(x,y,k+1);}}else if(pre[xx][yy]==1||pre[xx][yy]==3){if(i==1||i==3) pre[x][y]=i,dfs(x,y,k);//实在没想起来怎么快速判断,索性暴力else {if(k<minn) pre[x][y]=i,dfs(x,y,k+1);//不一样就转向}}}vis[x][y]=0;}
}int main(){cin>>n;for(int i=1;i<=n;++i){for(int j=1;j<=n;++j){cin>>a[i][j];if(a[i][j]=='x') vis[i][j]=1;if(a[i][j]=='A') sx=i,sy=j,vis[i][j]=1;if(a[i][j]=='B') ex=i,ey=j; //结尾别标记,标记进不去了}}dfs(sx,sy,0);if(check) cout<<minn<<endl;else cout<<-1<<endl;return 0;
}

bfs思路:1.直接暴力维护(记录方向)    

2. 将一开始的扩展次数设为-1,然后,对每一次队头的元素进行无尽拓展(最开始是A),直到它走到边界或者障碍,可以证明(如果在一条线上,肯定会被拓展到,如果不在,就不会,这时候会被其他的队头扩展,又会增加)

该图片摘自洛谷 GNAQ的博客

如图所以,将A拓展到的加入队列,然后将某一个作为队头继续扩展(注意 被访问过就不处理 接着拓展)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/471591.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

积分(二)——复化Simpson(C++)

前言 前言 simpson积分 simpson积分公式 ∫ a b f ( x ) d x ≈ b − a 6 [ f ( a ) f ( b ) 4 f ( a b 2 ) ] \int_{a}^{b}f(x)dx \approx \frac{b-a}{6}[f(a)f(b)4f(\frac{ab}{2})] ∫ab​f(x)dx≈6b−a​[f(a)f(b)4f(2ab​)] 与梯形积分类似&#xff0c;当区间[a,b]较…

AI大模型学习笔记之五:监督学习--数据如何驱动决策

监督学习&#xff0c;又称为监督式机器学习&#xff0c;是机器学习和人工智能领域的一个重要分支。 其基本原理是利用带有标签的数据集来训练算法&#xff0c;以实现精确分类数据或预测结果的目标。 在监督学习中&#xff0c;通过将数据输入模型&#xff0c;并不断调整数据权…

【知识整理】产研中心岗位评定标准之大数据岗位

为贯彻执行集团数字化转型的需要,该知识库将公示集团组织内各产研团队不同角色成员的职务“职级”岗位的评定标准; 一、定级定档目的 通过对公司现有岗位及相应岗位员工的工作能力、工作水平进行客观公正评定,确定各岗位的等级及同等级岗位员工对应的档级,从而为员工以后的晋升…

CSS篇--transform

CSS篇–transform 使用transform属性实现元素的位移、旋转、缩放等效果 位移 // 语法 transform:translate(水平移动距离&#xff0c;垂直移动距离) translate() 如果只给一个值&#xff0c;表示x轴方法移动距离 单独设置某个方向的移动距离&#xff1a;translateX() transla…

bpmn-js 事件总线处理

bpmn-js中使用EventBus作为事件的处理句柄&#xff0c;EventBus的使用和我们常规使用的事件总线没啥大的区别&#xff0c;其源码位于&#xff1a;/diagram-js/lib/core/EventBus.js &#xff08;bpmn-js使用diagram-js实现流程图的web端绘制呈现工具&#xff09;。 EventBus使用…

我的NPI项目之Android USB 系列(一) - USB的发展历史

设计目的 USB was designed to standardize the connection of peripherals to personal computers, both to exchange data and to supply electric power. 一个是为了标准化电脑连接外设的方法。 能够支持电脑和外设的数据交互和&#xff08;对外&#xff09;供电。 目前已…

fgets的使用方法详解

fgets的使用 文章目录 fgets的使用前言&#xff08;吹水&#xff0c;不看也罢&#xff09;fgets 的基本语法使用示例fgets() 对输入的处理的特点gets() 与 fgets() 的主要区别 总结 前言&#xff08;吹水&#xff0c;不看也罢&#xff09; 鼠鼠今天在B站上大学的时候&#xff…

洛谷_P1116 车厢重组_python写法

这道题看起来很高级其实就是冒泡排序执行的次数。 那对于python而言的话&#xff0c;这道题最大的难点在于如何实现数据输入既可以是以空格隔开的数据又可以是换行隔开的数据&#xff0c;那代码里面有了十分详细的解释。 n int(input()) l [] while len(l) < n: # 如果没…

Mysql——update更新数据的方式

注&#xff1a;文章参考&#xff1a; MySQL 更新数据 不同条件(批量)更新不同值_update批量更新同一列不同值-CSDN博客文章浏览阅读2w次&#xff0c;点赞20次&#xff0c;收藏70次。一般在更新时会遇到以下场景&#xff1a;1.全部更新&#xff1b;2.根据条件更新字段中的某部分…

【C语言】Linux 内核listen系统调用代码

一、Linux 4.19内核listen系统调用代码注释 /** 开始对一个 socket 进行监听。这个函数做一些准备工作以便 socket 可以开始监听&#xff0c;* 如果操作成功&#xff0c;则将 socket 标记为准备好监听的状态。*/int __sys_listen(int fd, int backlog) {struct socket *sock…

实现MainActivity转到其他界面的功能实现

#安卓 实现MainActivity转到其他界面的功能实现 实现步骤&#xff1a; 1.添加两个界面及&#xff1b;layout&#xff0c;分别为fullsreen和dialog 2.mainifest中注册两个antivity 3.向Mainactivity中代码。用intent简单的跳转 package com.example.myapplication;import an…

【HarmonyOS】鸿蒙开发之渲染控制——第2.3章

if/eles条件渲染 if的使用方法与javascript&#xff0c;java中使用的if/eles条件渲染使用基本一致。 案例: Entry Component struct IfElseDemo{State isShow:boolean false;build(){Column() {TitleBar({titleBarAttribute: {title: "ifElse使用案例",backShow:…