20220205每日一题黄金矿工刷后感

原题链接:leetcode1219 黄金矿工

一个中等题而已,轻轻松松就写过去了,不过却有些其他的想记录下来。
一开始看这个题,我以为是可以并查集,找区块,然后统计每个区块的数值和选出最大的区块;解和样例仔细看看,发现只是一个DFS的问题,从任意一点搜索,找出最大路径和,很简单嘛。

但是我却陷入了一个误区,并不是说这个题写不出来,而是在写之前,先想到的是“啊?这玩意要是写DFS,我岂不是要每个端点都跑一遍DFS,这复杂度可不低啊,怕不是考的别的我没想出来?”(在我印象里,DFS这种东西不到最后不要逃出来,简直暴力,遍历所有结果,效率极其低下)想完之后,确实没想到什么其他的更快的解法,那姑且这么跑吧。
跑完之后时间击败50%,空间击败5%。倒也是意料之中,慢的意料之中。不过简单翻了翻题解,或许这东西是正解,只是我写的不太好,比较慢而已。


最后想说的,主要是在当时的那个误区。
对于一个问题而言,能解决是第一步,优雅的解决是第二步,如果都不能先解决问题,却想要直接优雅的解决,我想,我现在还没有那个实力;但却总是想着“不对啊,我的这个想法怎么这么‘幼稚’,这么慢的算法都能掏出来吗?不对,肯定是别的解法我没有想到。”
一种介于不自信(我提出的解决方案太蠢了)和极度自信(我可以想出更好的)的叠加态,却没有先动手执行,应当予以改正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是基于 Eclipse 的黄金矿工游戏实现步骤: 1. 首先,在 Eclipse 中创建一个新的 Java 项目,并将其命名为“GoldMiner”。 2. 在 src 目录下创建一个名为“GoldMiner.java”的主类,并在其中添加以下代码: ```java import javax.swing.JFrame; public class GoldMiner extends JFrame { public GoldMiner() { // 设置窗口标 setTitle("黄金矿工"); // 设置窗口大小 setSize(800, 600); // 设置窗口初始位置 setLocationRelativeTo(null); // 设置窗口关闭时退出程序 setDefaultCloseOperation(EXIT_ON_CLOSE); // 显示窗口 setVisible(true); } public static void main(String[] args) { new GoldMiner(); } } ``` 3. 运行程序,可以看到一个空白的窗口。 4. 接下来,在 src 目录下创建一个名为“GoldMinerPanel.java”的面板类,并在其中添加以下代码: ```java import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JPanel; import javax.swing.Timer; public class GoldMinerPanel extends JPanel implements ActionListener { private Image background; // 背景图片 private Timer timer; // 定时器 public GoldMinerPanel() { // 加载背景图片 background = Toolkit.getDefaultToolkit().getImage("resources/background.jpg"); // 创建定时器,每隔10毫秒触发一次actionPerformed方法 timer = new Timer(10, this); timer.start(); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); // 绘制背景图片 g.drawImage(background, 0, 0, getWidth(), getHeight(), this); } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub } } ``` 5. 在 GoldMiner 类的构造方法中添加以下代码来创建 GoldMinerPanel 对象并添加到窗口中: ```java public GoldMiner() { // 设置窗口标 setTitle("黄金矿工"); // 设置窗口大小 setSize(800, 600); // 设置窗口初始位置 setLocationRelativeTo(null); // 设置窗口关闭时退出程序 setDefaultCloseOperation(EXIT_ON_CLOSE); // 创建面板并添加到窗口 GoldMinerPanel panel = new GoldMinerPanel(); add(panel); // 显示窗口 setVisible(true); } ``` 6. 运行程序,可以看到背景图片已经显示在窗口中。 7. 接下来,我们需要添加一个小车和一些金块到窗口中。 8. 在 src 目录下创建一个名为“Car.java”的小车类,并在其中添加以下代码: ```java import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; public class Car { private int x; // 小车的横坐标 private int y; // 小车的纵坐标 private Image image; // 小车的图片 public Car() { // 设置小车的初始坐标和图片 x = 400; y = 500; image = Toolkit.getDefaultToolkit().getImage("resources/car.png"); } public void draw(Graphics g) { // 绘制小车图片 g.drawImage(image, x, y, null); } } ``` 9. 在 GoldMinerPanel 类中添加以下代码来创建 Car 对象并绘制到面板上: ```java private Car car; // 小车对象 public GoldMinerPanel() { // 加载背景图片 background = Toolkit.getDefaultToolkit().getImage("resources/background.jpg"); // 创建定时器,每隔10毫秒触发一次actionPerformed方法 timer = new Timer(10, this); timer.start(); // 创建小车对象 car = new Car(); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); // 绘制背景图片 g.drawImage(background, 0, 0, getWidth(), getHeight(), this); // 绘制小车 car.draw(g); } ``` 10. 运行程序,可以看到小车已经显示在窗口中。 11. 接下来,我们需要添加金块到窗口中。 12. 在 src 目录下创建一个名为“Gold.java”的金块类,并在其中添加以下代码: ```java import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; public class Gold { private int x; // 金块的横坐标 private int y; // 金块的纵坐标 private int type; // 金块的类型(1:大金块,2:中金块,3:小金块) private Image image; // 金块的图片 public Gold(int x, int y, int type) { // 设置金块的初始坐标和类型 this.x = x; this.y = y; this.type = type; // 加载金块图片 switch (type) { case 1: image = Toolkit.getDefaultToolkit().getImage("resources/big_gold.png"); break; case 2: image = Toolkit.getDefaultToolkit().getImage("resources/medium_gold.png"); break; case 3: image = Toolkit.getDefaultToolkit().getImage("resources/small_gold.png"); break; } } public void draw(Graphics g) { // 绘制金块图片 g.drawImage(image, x, y, null); } } ``` 13. 在 GoldMinerPanel 类中添加以下代码来创建一些金块对象并绘制到面板上: ```java private List<Gold> golds; // 金块列表 public GoldMinerPanel() { // 加载背景图片 background = Toolkit.getDefaultToolkit().getImage("resources/background.jpg"); // 创建定时器,每隔10毫秒触发一次actionPerformed方法 timer = new Timer(10, this); timer.start(); // 创建小车对象 car = new Car(); // 创建金块列表 golds = new ArrayList<>(); golds.add(new Gold(100, 100, 1)); golds.add(new Gold(200, 200, 2)); golds.add(new Gold(300, 300, 3)); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); // 绘制背景图片 g.drawImage(background, 0, 0, getWidth(), getHeight(), this); // 绘制小车 car.draw(g); // 绘制金块列表 for (Gold gold : golds) { gold.draw(g); } } ``` 14. 运行程序,可以看到金块已经显示在窗口中。 15. 最后,我们需要让小车能够移动并抓取金块。 16. 在 Car 类中添加以下代码来实现小车的移动: ```java public void moveLeft() { // 将小车向左移动10个像素 x -= 10; // 判断小车是否超出窗口左边界 if (x < 0) { x = 0; } } public void moveRight() { // 将小车向右移动10个像素 x += 10; // 判断小车是否超出窗口右边界 if (x > getWidth() - image.getWidth(null)) { x = getWidth() - image.getWidth(null); } } ``` 17. 在 GoldMinerPanel 类中添加以下代码来实现键盘监听和小车的移动: ```java @Override public void actionPerformed(ActionEvent e) { // 判断是否有金块与小车重叠 for (Gold gold : golds) { if (gold.x >= car.x && gold.x <= car.x + car.image.getWidth(null) && gold.y >= car.y && gold.y <= car.y + car.image.getHeight(null)) { // 从金块列表中移除该金块 golds.remove(gold); break; } } // 重新绘制面板 repaint(); } @Override protected void paintComponent(Graphics g) { // ... } @Override public void keyPressed(KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_LEFT: car.moveLeft(); break; case KeyEvent.VK_RIGHT: car.moveRight(); break; } } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub } public GoldMinerPanel() { // 加载背景图片 background = Toolkit.getDefaultToolkit().getImage("resources/background.jpg"); // 创建定时器,每隔10毫秒触发一次actionPerformed方法 timer = new Timer(10, this); timer.start(); // 创建小车对象 car = new Car(); // 创建金块列表 golds = new ArrayList<>(); golds.add(new Gold(100, 100, 1)); golds.add(new Gold(200, 200, 2)); golds.add(new Gold(300, 300, 3)); // 添加键盘监听器 addKeyListener(this); setFocusable(true); } public static void main(String[] args) { // 创建窗口对象 JFrame frame = new JFrame("黄金矿工"); frame.setSize(800, 600); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 创建面板对象 GoldMinerPanel panel = new GoldMinerPanel(); frame.add(panel); // 显示窗口 frame.setVisible(true); } ``` 18. 运行程序,可以使用左右方向键来控制小车移动,抓取金块。 这就是用 Eclipse 实现黄金矿工游戏的基本步骤。当然,这只是一个简单的示例,游戏的实现还需要更多的功能和细节处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值