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