acm算法题 3009 Curling 2.0(dfs)

这是一篇关于ACM算法题3009的文章,介绍了Curling 2.0的游戏规则,并提供了一个使用深度优先搜索(DFS)策略解决此问题的案例。题目要求设计程序判断石头能否在10次投掷内从起点到达目标,并找出所需的最少移动次数。文章给出了示例输入和输出,以及代码实现。
摘要由CSDN通过智能技术生成

acm算法题 3009(dfs)

Curling 2.0: 原题网址

题目大意

冰壶运动

  • 一开始,石头在起点S上静止不动。
  • 石头的运动仅限于 x 和 y 方向,禁止对角线移动。
  • 当石头静止不动时,你可以通过投掷它来让它移动。您可以将其扔向任何方向,除非它立即被阻挡。
  • 投掷后,石头会继续向同一方向移动,直到发生以下情况之一:
  • 1.石头撞到阻碍物上
    • 石头停在它撞到的方块旁边的广场上
    • 阻碍物块消失
  • 2.石头从板子上出来了
    • 游戏以失败告终
  • 3.石头到达目标广场
    • 石头停在那里,游戏以成功告终
  • 在一场比赛中,投掷石头的次数不能超过 10 次。如果石头在 10 步内没有达到目标,游戏就会以失败告终。根据规则,设计程序看石头是否能达到目标,如果是,求所需的最低移动次数。

• Time Limit: 1000MS Memory Limit: 65536K

例子:
如下图所示的初始配置中,需要 4 步才能将石头从起点带到目标。
在这里插入图片描述
Input
第一行:板的宽w 和高h(2 <= w <= 20, 1 <= h <= 20)
接着h*w的数据,其中:
0 -空置广场
1 -阻碍块
2 -起始位置
3 -目标位置
Output
能达到终点则输出最步数,否则输出-1.

例如:
Input
6 1
1 1 2 1 1 3
output
-1
Input
6 6
1 0 0 2 1 0
1 1 0 0 0 0
0 0 0 0 0 3
0 0 0 0 0 0
1 0 0 0 0 1
0 1 1 1 1 1
output
4

代码实现

主要使用了dfs 根据起点位置开始运动,每次根据当前位置分别判断上下左右四个方向的可能性移动possiblePos(≤4),循环遍历possiblePos,在这些可能的位置继续dfs探索,最终选出能到达终点的最少步数。 需要注意的是题目中遇到障碍块后会清除障碍,因此在dfs时需要实时更新board内容,并在一种情况探索结束后board回溯成原先状态。

亲测可pass。
在这里插入图片描述

#include <iostream>
#include <algorithm>

using namespace std;

const int inf = 11;
int w, h;
int board[20][20];

//上 下 左 右
const int xDir
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值