博客
关于我
牛牛与跷跷板
阅读量:386 次
发布时间:2019-03-05

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

为了解决这个问题,我们需要找到从起点到终点的最小跳跃次数。跳跃规则是只能从同一行或者同一列的下一行跃过去。我们可以使用广度优先搜索(BFS)来解决这个问题,因为BFS适合寻找最短路径的问题。

方法思路

  • 读取输入并初始化数据:首先读取输入数据,建立每个板块的位置信息,包括它在哪一行,左边界和右边界。
  • 排序板块:将所有板块按照从上到下的顺序排列,如果同一行的话,从左到右排列。
  • 建立图的边
    • 同一行的连通区域:对于每个板块k,直接与其右边的板块k+1连通。
    • 同一列的下一行的连通区域:对于每个板块k,找到下一行的连通区域,并与该区域的左右边界点连通。
  • 广度优先搜索(BFS):从起点开始,逐层扩展,找到到达终点的最短路径。
  • 解决代码

    #include 
    using namespace std;typedef long long ll;queue
    q;int tot = 0, s = -1, z = -1;int head[100010], dis[100010];struct ban { int l, r, p, y; } a[100010];struct ty { int next, t; } edge[2000010];void bfs() { dis[s] = 1; q.push(s); while (!q.empty()) { int x = q.front(); q.pop(); for (int i = head[x]; i != -1; i = edge[i].next) { int y = edge[i].t; if (dis[y] == -1) { dis[y] = dis[x] + 1; q.push(y); } } }}bool cmp(const ban &a, const ban &b) { if (a.y != b.y) return a.y < b.y; return a.l < b.l;}int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n = 0; cin >> n; for (int i = 1; i <= n; ++i) { a[i].y = 0, a[i].l = 0, a[i].r = 0; cin >> a[i].y >> a[i].l >> a[i].r; a[i].p = i; } sort(a + 1, a + n + 1, cmp); for (int i = 1; i <= n; ++i) { cout << a[i].p << " "; } int l = 1, r = 1; for (int i = 1; i <= n; ++i) { if (a[i].y == a[i + 1].y && a[i].r == a[i + 1].l) { edge[tot].next = head[i]; edge[tot].t = i; head[i] = tot++; edge[tot].next = head[i + 1]; edge[tot].t = i + 1; head[i + 1] = tot++; } } for (int i = 1; i <= n; ++i) { int current_y = a[i].y; int current_l = a[i].l; int current_r = a[i].r; l = max(current_l, 1); r = current_r; while (l <= r) { if (a[l].y != current_y) { l++; continue; } if (a[l].l > current_r) { break; } if (a[l].r < current_l) { l++; continue; } edge[tot].next = head[i]; edge[tot].t = l; head[i] = tot++; edge[tot].next = head[i]; edge[tot].t = r; head[i] = tot++; } if (l > 1) l--; } for (int i = 1; i <= n; ++i) { if (a[i].p == n) { s = i; z = i; } } bfs(); cout << dis[z] - 1 << endl;}

    代码解释

  • 读取输入和初始化数据:读取输入数据并初始化每个板块的位置信息。
  • 排序板块:按照从上到下的顺序排列,如果同一行则从左到右排列。
  • 建立图的边
    • 同一行的连通区域:处理同一行的连通区域,直接连接相邻的板块。
    • 同一列的下一行的连通区域:使用贪心方法,找到下一行的连通区域,并连接左右边界点。
  • 广度优先搜索(BFS):从起点开始,逐层扩展,找到到达终点的最短路径,并输出结果。
  • 转载地址:http://qpxwz.baihongyu.com/

    你可能感兴趣的文章
    Mysql学习总结(81)——为什么MySQL不推荐使用uuid或者雪花id作为主键?
    查看>>
    Mysql学习总结(82)——MySQL逻辑删除与数据库唯一性约束如何解决?
    查看>>
    Mysql学习总结(83)——常用的几种分布式锁:ZK分布式锁、Redis分布式锁、数据库分布式锁、基于JDK的分布式锁方案对比总结
    查看>>
    Mysql学习总结(84)—— Mysql的主从复制延迟问题总结
    查看>>
    Mysql学习总结(85)——开发人员最应该明白的数据库设计原则
    查看>>
    Mysql学习总结(8)——MySql基本查询、连接查询、子查询、正则表达查询讲解
    查看>>
    Mysql学习总结(9)——MySql视图原理讲解与使用大全
    查看>>
    Mysql学习笔记 - 在Centos7环境下离线安装Mysql
    查看>>
    MySQL学习笔记十七:复制特性
    查看>>
    Mysql学习第一课-mysql的定义及sql语句
    查看>>
    mysql学号的字符长度_MYSQL--2
    查看>>
    mysql安全模式: sql_safe_updates
    查看>>
    mysql安装,卸载,连接
    查看>>
    MySQL安装之没有配置向导
    查看>>
    mysql安装出现 conflicts with mysql*的解决办法
    查看>>
    mysql安装卡在最后一步解决方案(附带万能安装方案)
    查看>>
    mysql安装和启动命令小结
    查看>>
    Mysql安装教程(命令行)
    查看>>
    mysql安装版安装
    查看>>
    MySQL安装配置教程(非常详细),从零基础入门到精通,看完这一篇就够了
    查看>>