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

经典算法 青蛙跳杯子

青蛙跳杯子

题目描述

桌子上有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个点或者更多点了。
因为每次只加入一个点,所以干脆可以把队列改成循环了。循环末尾改变下状态就行。

相关文章:

  • 算法查找目录
  • 【C++】类和对象(中)——默认成员函数详解(万字)
  • Qt多线程TCP服务器实现指南
  • 【iview】icon样式
  • 速通Ollama本地部署DeepSeek-r1
  • ZYNQ 纯PL端逻辑资源程序固化流程
  • OpenSSL应用实践:嵌入式数据安全实战指南
  • Python3 基本数据类型
  • 408考研逐题详解:2009年第6题
  • Leetcode刷题报告2——双指针法
  • 假网关-为了节省公网IP的骚操作
  • KDD 2025 | (8月轮)时空数据(Spatial-temporal)论文总结
  • 【计算机视觉】语义分割:Mask2Former:统一分割框架的技术突破与实战指南
  • 第十一届蓝桥杯 2020 C/C++组 既约分数
  • 「Mac畅玩AIGC与多模态11」开发篇07 - 使用自定义名言插件开发智能体应用
  • 《Java高级编程:从原理到实战 - 进阶知识篇二》
  • spring源码学习之一-----spring依赖包作用分析
  • 【Machine Learning Q and AI 读书笔记】- 04 彩票假设
  • 单片机-89C51部分:12 pwm 呼吸灯 直流电机
  • 【Shell 脚本编程】详细指南:第一章 - 基础入门与最佳实践
  • 光明日报社论:用你我的匠心,托举起繁盛的中国
  • 新希望一季度归母净利润4.45亿,上年同期为-19.34亿
  • 普京与卢卡申科举行会晤,将扩大在飞机制造等领域合作
  • 腾讯重构混元大模型研发体系:成立大语言和多模态模型部,提升AI长期技术作战能力
  • 农行一季度净利润719亿元增2.2%,不良率微降至1.28%
  • “麒麟王”亮相上海彩市,体彩即开票“瑞兽家族”迎来新成员