当前位置: 首页 > java >正文

经典算法 青蛙跳杯子

青蛙跳杯子

题目描述

桌子上有n行m列的杯子,每个杯子与相邻杯子之间的距离为1,已知青蛙的跳跃半径为d,青蛙现在在第一行第一列的杯子上,它跳到最后一行最后一列的杯子上,最少需要跳几次?

输入描述

输入只有一行,分别为整数n, m和实数d。

输出描述

直接输出青蛙跳的最小步数。

输入示例

3 4 1.5

输出示例

3

样例解释

,表示青蛙的一条可能路径,只要再跳3步就行。

,。。。
。,。。
。。,,

c++代码(暴力bfs) 大约O(m * n * d)

#include<bits/stdc++.h>using namespace std;int n, m, ans = INT_MAX;
double d;
vector<vector<int>> dp;class node{
public:int i, j, recoder;
};void bfs() {dp[0][0] = 0;queue<node> q;node k, w;k.i = 0, k.j = 0;q.push(k);while(!q.empty()) {k = q.front(), q.pop();for (int i = 0; i <= (int)(d) && k.i + i < n; i++) {for (int j = 0; j <= (int)(d) && k.j + j < m && i * i + j * j <= d * d; j++) {if (dp[k.i][k.j] + 1 < dp[k.i + i][k.j + j]) {w.i = k.i + i, w.j = k.j + j;dp[w.i][w.j] = dp[k.i][k.j] + 1;q.push(w);}}}}
}int main() {cin >> n >> m >> d;dp = vector<vector<int>>(n, vector<int>(m, INT_MAX));bfs();cout << dp[n - 1][m - 1];return 0;
}

c++代码(贪心法) 大约等于O(min(m, n) * d)

#include<bits/stdc++.h>using namespace std;int n, m, x, y, cont = 0, a, b;
double d, z;int main() {cin >> n >> m >> d;a = 0, b = 0;while(a != n - 1 || b != m - 1) {z = DBL_MAX;for (int i = 0; i <= (int)(d) && a + i < n; i++) {for (int j = 0; j <= (int)(d) && b + j < m && i * i + j * j <= d * d; j++) {int delta = (n - 1 - (a + i)) * (n - 1 - (a + i)) + (m - 1 - (b + j)) * (m - 1 - (b + j));if (delta < z) z = delta, x = a + i, y = b + j;}}a = x, b = y;cont++;}cout << cont;return 0;
}//by wqs

题目解析

暴力法

暴力法的思路很简单,我们定义dp[i][j]表示从(0, 0)到(i, j)最少需要多少步
从队列取出dp[i][j]
遍历dp[i ~ i + int(d)][j ~ j + int[d]]如果两点距离小于d则更新
dp[i ~ i + int(d)][j ~ j + int[d]] = min(dp[i ~ i + int(d)][j ~ j + int[d]], dp[i][j] + 1);
然后把dp[i ~ i + int(d)][j ~ j + int[d]]加入队列,
循环这个步骤就行。

贪心法

贪心法的思路是我们没必要将所有状态加入队列。
我们只需要把与终点直线距离最小的那个点加入就行了。
怎么证明我不会,自己去搜搜吧。
事实上,有一种情况是有2个点同时距离终点最小。
因为这些坐标都是整数,所以这两个状态是对称的你只要选择其中一个就好了。
也因为这些坐标都是整数,实际上不可能会出现3个点或者更多点了。
因为每次只加入一个点,所以干脆可以把队列改成循环了。循环末尾改变下状态就行。
http://www.xdnf.cn/news/3330.html

相关文章:

  • 【大模型实战篇】华为信创环境采用vllm部署QwQ-32B模型
  • 【MySQL】复合查询与内外连接
  • 补题( Convolution, 二维卷积求输出矩阵元素和最大值)
  • 【方案分享】基于Three.js和Stencil Buffer的AR实物遮挡方案,支持不规则动态区域(AR地下设施、AR虚实遮挡)
  • 前端面经-webpack篇--定义、配置、构建流程、 Loader、Tree Shaking、懒加载与预加载、代码分割、 Plugin 机制
  • ruoyi-plus Spring Boot + MyBatis 中 BaseEntity 的设计与动态查询实践
  • AVDictionary 再分析
  • 安全学习基础入门5集
  • curl详解
  • 综合案例建模(1)
  • 毕业论文 | 基于STM32的自动烟雾报警系统设计
  • 4.30阅读
  • Seata客户端@GlobalTransactional核心源码解析
  • Linux企业级分区设置
  • PEFT实战(三)——IA3参数高效微调
  • QT6 源(62)篇五:阅读与注释 QString 这个类,先给出官方综述,带一些翻译。总篇目太大,代码就有 2000 行
  • c++ 归并排序(分治)
  • 中国1km分辨率1901-2023年均气温降水数据
  • 2025年- H15-Lc123-41.缺失的第一个正数(普通数组)---java版
  • 格雷希尔用于工业气体充装站的CZ系列气罐充装转换连接器,其日常维护有哪些
  • linux jounery 日志相关问题
  • 高性能架构设计-分库分表
  • 声明:个人从未主动把文章设置为仅vip可读
  • 国内 AI 发展路线分析
  • /var/log/sssd/` 目录解析
  • 【Linux】gcc/g++配置
  • ROS2与Carla安装设备(其三)测试 ROS 2
  • 【MySQL数据库】事务
  • [第十五章][15.3.2 shellcode注入攻击]ret2shellcode+[NewStarCTF 公开赛赛道]ret2shellcode
  • LiP-MS与TPP联用:千金藤素在高尿酸血症中的抗神经炎症作用