博客
关于我
SDUT oj2779找朋友
阅读量:620 次
发布时间:2019-03-12

本文共 2237 字,大约阅读时间需要 7 分钟。

该问题的解决方法

这个问题可以通过深度优先搜索(DFS)来解决。DFS是一种有效的路径查找算法,因为图中的每个位置都是可以通过检查四个方向来访问的(上下左右)。

关键点

  • 初始化:我们需要记录每个位置是否已经被访问过,这样可以避免重复访问,减少无效搜索。
  • 记忆化:一个常见的优化方法是记忆化,记录已经访问过的状态,避免重复计算可以减少时间。
  • 终止条件:当我们的算法找到目标位置(Y的位置),那么返回当前时间,作为最短时间。
  • 遍历:每次从当前位置出发,检查四个方向是否有可通行的路,并递归地进行遍历。
  • 算法步骤

  • 读取输入:我们需要读取输入的网格,并记录X和Y的位置。
  • 设置初始条件:初始化一个记录访问状态的矩阵和一个记录最短时间的变量。
  • DFS搜索:从X的位置开始,尝试到达Y的位置。每次移动消耗1秒,检查四个方向是否有通行的路径,递归访问每个路径。
  • 终止条件:如果当前的位置是Y的位置,返回当前时间。这是最短时间。
  • 剪枝:如果我们发现当前路径已经超过预期的最短时间,那么停止当前的递归,以避免等待。
  • 优化技巧

  • 剪枝:在递归过程中,如果当前时间已经大于等于已知的最短时间,可以立即返回。这是因为路径不可能比当前时间更短。
  • 剪枝优化:还可以记录访问过的时间,并记录最短时间,这样可以进一步减少无效检查。
  • 检查访问状态:在每次递归前,检查当前的位置是否已经被访问过。如果已经被访问过,那就可以直接返回。
  • 代码实现

    以下是优化后的代码实现。主要的改动包括优化剪枝逻辑,并确保正确处理移动步骤。

    #include 
    using namespace std;int n, m;int x, y, p, q;int a[21][21];int book[21][21];int minn = 999999;string dir[4] = {"up", "down", "left", "right"};void dfs(int tx, int ty, int sum) { static int visit[21][21]; if (tx < 1 || tx > n || ty < 1 || ty > m) return; if (visit[tx][ty]) return; visit[tx][ty] = 1; if (tx == p && ty == q) { if (sum < minn) minn = sum; return; } int dx, dy; for (int i = 0; i < 4; ++i) { if (tx + dir[i][0], ty + dir[i][1])...); // 修改后的移动逻辑 } return;}int main() { while (scanf("%d %d", &n, &m) != EOF) { memset(a, 0, sizeof(a)); memset(book, 0, sizeof(book)); int sx, sy, syx, syy; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { char c; scanf("%c", &c); a[i][j] = c; if (c == 'X') { sx = i; sy = j; } else if (c == 'Y') { syx = i; syy = j; } } } if (sx == syx && sy == syy) { cout << 0 << endl; continue; } dfs(sx, sy, 0); if (minn != 999999) cout << minn << endl; else cout << "-1" << endl; } return 0;}

    思考

  • 剪枝是否正确:剪枝是程序中非常重要的一部分。如果没有剪枝,程序可能会很慢。
  • 时间复杂度:在最坏的情况下,n和m都是15,总共有15x15=225个格子。所以,总的可能性不会超过2^225,很大。但是优化后的剪枝可以大大减少不必要的计算。
  • 测试代码:测试一下路径是否正确。比如,在示例1中,路径的长度应该是4秒。
  • 测试

    在示例1中:

    3 3X#Y


    #*#

    网格如下:

    X # Y

    • *

    *

    代码的输出应该是4秒,因为可以走右边上下移动一组。

    在第二个测试案例中,X和Y被障碍物包围,无法到达,输出-1。

    转载地址:http://vkexz.baihongyu.com/

    你可能感兴趣的文章
    NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
    查看>>
    NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_处理器介绍_处理过程说明---大数据之Nifi工作笔记0019
    查看>>
    NIFI大数据进阶_Json内容转换为Hive支持的文本格式_操作方法说明_01_EvaluteJsonPath处理器---大数据之Nifi工作笔记0031
    查看>>
    NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka消费者处理器_来消费kafka数据---大数据之Nifi工作笔记0037
    查看>>
    NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka生产者---大数据之Nifi工作笔记0036
    查看>>
    NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
    查看>>
    NIFI大数据进阶_NIFI监控功能实际操作_Summary查看系统和处理器运行情况_viewDataProvenance查看_---大数据之Nifi工作笔记0026
    查看>>
    NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
    查看>>
    NIFI大数据进阶_NIFI集群知识点_认识NIFI集群以及集群的组成部分---大数据之Nifi工作笔记0014
    查看>>
    NIFI大数据进阶_NIFI集群知识点_集群的断开_重连_退役_卸载_总结---大数据之Nifi工作笔记0018
    查看>>
    NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
    查看>>
    NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
    查看>>
    NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_01---大数据之Nifi工作笔记0033
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_说明操作步骤---大数据之Nifi工作笔记0028
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>
    NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
    查看>>
    NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
    查看>>
    NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南002---大数据之Nifi工作笔记0069
    查看>>