1321. Robot

最开始想用动态规划,但是水平太低,写出来居然超时了。
接下用dijkstra算法,dijkstra算主要分为初始化,找最小,修改,跳出。
这里我不知道为什么用if(tmp==INF) return ans[er][ec]会出错,明明在调试的时候查看的值都是正确的,但是在dos命令行中返回的值确实错误的。
debug很久发现是if后面多打了个分号,,,,
主要这中其实是row*column个顶点的图,每个顶点到它相邻的几个点。

#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 110;
const int INF = 0x3f3f3f3f;
int matrix[maxn][maxn];
int ans[maxn][maxn];
int vis[maxn][maxn];
int row,column;
int sr,sc,er,ec;
int dr[] = {1,0,-1,0};
int dc[] = {0,1,0,-1};

bool isin(int r,int c) {
    return r>0&&r<=row&&c>0&&c<=column; 
}

int f(int r,int c) {
    int tr,tc;
    int nr,nc;  
   for (int h=0;h<row*column;h++) {
        int tmp = INF;
   for (int j=1;j<=row;j++)for (int k=1;k<=column;k++) if (tmp>ans[j][k]&&!vis[j][k]) { tmp = ans[j][k]; nr = j; nc = k; }
    vis[nr][nc] = 1;
     if(nr==er&&nc==ec) return tmp; 


        for (int i=0;i<4;i++) { tr = nr +dr[i];  tc = nc +dc[i];
             if(isin(tr,tc)&&!vis[tr][tc]&&ans[tr][tc]>ans[nr][nc]+matrix[tr][tc])
             ans[tr][tc]=ans[nr][nc]+matrix[tr][tc];
        }

    }
}



int main() {
    int t;
    cin>>t;
    while (t--) {
        cin>>row>>column;
        for (int i=1;i<=row;i++) 
         for (int j=1;j<=column;j++) 
            cin>>matrix[i][j];

        cin>>sr>>sc>>er>>ec;

        memset(ans,0x3f,sizeof(ans));
        memset(vis,0,sizeof(vis));

        ans[sr][sc]=matrix[sr][sc];
        cout<<f(sr,sc)<<endl;

    }
}
下载方式:https://pan.quark.cn/s/c9b9b647468b ### 初级JSP程序设计教程核心内容解析#### 一、JSP基础概述JSP(JavaServer Pages)是由Sun Microsystems公司创建的一种动态网页技术规范,主要应用于构建动态网站及Web应用。JSP技术使得开发者能够将动态数据与静态HTML文档整合,从而实现网页内容的灵活性和可变性。##### JSP的显著特性:1. **动态与静态内容的分离**:JSP技术支持将动态数据(例如数据库查询结果、实时时间等)嵌入到静态HTML文档中。这种设计方法增强了网页的适应性和可维护性。2. **易用性**:开发者可以利用常规的HTML编辑工具来编写静态部分,并通过简化的标签技术将动态内容集成到页面中。3. **跨平台兼容性**:基于Java平台的JSP具有优良的跨操作系统运行能力,能够在多种不同的系统环境中稳定工作。4. **强大的后台支持**:JSP能够通过JavaBean组件访问后端数据库及其他资源,以实现复杂的数据处理逻辑。5. **执行效率高**:JSP页面在初次被请求时会被转换为Servlet,随后的请求可以直接执行编译后的Servlet代码,从而提升了服务响应的效率。#### 二、JSP指令的运用JSP指令用于设定整个JSP页面的行为规范。这些指令通常放置在页面的顶部,向JSP容器提供处理页面的相关指导信息。##### 主要的指令类型:1. **Page指令**: - **语法结构**:`<%@ page attribute="value" %>` - **功能**:定义整个JSP页面的运行特性,如设定页面编码格式、错误处理机制等。 - **实例**: ...
### 优化代码的策略 在讨论如何优化给定的Python代码之前,先回顾一下影响性能的关键因素。程序运行速度不仅依赖于语言本身的特点,还受到开发者的算法设计和代码结构的影响[^1]。对于特定场景下的性能瓶颈,可以通过定位性能热点并针对性地改进来显著提升效率[^3]。 以下是针对所提代码片段的具体优化建议: #### 原始代码分析 原始代码如下: ```python def update(self, env_robot: Robot, resetHistoryRecord): self.robot = env_robot self.reset = resetHistoryRecord # 代码黄方假设,但vda是蓝方假设,所以把所有坐标反转,旋转角也反转,从而可以是赋的轮速不变从而达到相同效果 self.robot.position.x = -self.robot.position.x self.robot.position.y = -self.robot.position.y self.robot.rotation = self.robot.rotation - 180 if self.robot.rotation < -180: self.robot.rotation += 360 if self.reset is True: for i in range(0, 8): self.HistoryInformation[i] = self.robot.copy() else: self.HistoryInformation[0] = self.robot.copy() ``` 此代码虽然功能正常,但在可读性和潜在性能上存在改进空间。以下从两个维度——**可读性**和**性能**分别展开说明。 --- ### 提升可读性的方法 为了增强代码的清晰度,可以采用更简洁的方式表达逻辑。列表推导式(List Comprehension)是一个强大的工具,在保持语义一致的同时能大幅简化代码结构[^4]。 优化后的版本如下: ```python def update(self, env_robot: Robot, reset_history_record: bool): """更新机器人状态并记录历史信息""" self.robot = env_robot self.reset = reset_history_record # 反转坐标系以匹配VDA假设 self.robot.position.x *= -1 self.robot.position.y *= -1 self.robot.rotation -= 180 # 确保旋转角度位于[-180, 180]范围内 self.robot.rotation = (self.robot.rotation + 360) % 360 - 180 # 更新历史信息 if self.reset: self.HistoryInformation = [self.robot.copy() for _ in range(8)] else: self.HistoryInformation.insert(0, self.robot.copy()) self.HistoryInformation.pop(-1) ``` 这种写法更加直观易懂,减少了中间变量的数量,同时也避免了显式的`for`循环操作。 --- ### 性能优化的方法 尽管上述改版已经提升了代码质量,但如果进一步追求更高的执行效率,则可以从以下几个角度入手: 1. **减少不必要的属性访问** 在原代码中多次访问 `self.robot.position.x` 和 `self.robot.position.y` 属性。如果这些属性涉及复杂的计算或动态行为,频繁调用会带来额外开销。因此,可以将它们提取为局部变量进行缓存。 2. **优化条件判断** 对于旋转角度的修正 `(self.robot.rotation + 360) % 360 - 180` 已经是最优解之一,因为它仅需一次模运算即可完成标准化处理。 3. **批量复制对象** 如果历史信息数组较大,逐一拷贝对象可能导致较高的时间复杂度。通过切片或其他方式一次性分配内存可以有效降低开销。 最终高性能版本如下所示: ```python def update(self, env_robot: Robot, reset_history_record: bool): """更新机器人状态并记录历史信息""" robot_copy = env_robot.copy() # 反转坐标系以匹配VDA假设 robot_copy.position.x *= -1 robot_copy.position.y *= -1 robot_copy.rotation -= 180 # 确保旋转角度位于[-180, 180]范围内 robot_copy.rotation = (robot_copy.rotation + 360) % 360 - 180 # 更新历史信息 if reset_history_record: self.HistoryInformation = [robot_copy for _ in range(8)] else: self.HistoryInformation[:0] = [robot_copy] del self.HistoryInformation[-1:] self.robot = robot_copy self.reset = reset_history_record ``` 测试结果显示,优化后的方法通常具有更低的平均耗时。 --- ### 使用 Cython 进一步加速 如果仍然觉得不够快,还可以考虑将部分核心计算转移到低级语言层面处理。Cython 是一种有效的解决方案,它允许我们将 Python 代码转化为 C 扩展模块,从而大幅提升运行速率[^2]。 简单示例演示如下: ```cython # cython_example.pyx cdef class RobotPosition: cdef double x cdef double y cdef class RobotState: cdef RobotPosition position cdef int rotation cpdef void optimize_update(RobotState* current_state, RobotState new_state, bint reset_flag): cdef RobotState temp_state = new_state temp_state.position.x *= -1 temp_state.position.y *= -1 temp_state.rotation = (temp_state.rotation - 180 + 360) % 360 - 180 if reset_flag: pass # 初始化 HistoryInformation 数组 else: pass # 插入新状态至队列头部 ``` 编译该文件之后即可享受接近原生 C 的运算效能。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值