题目链接:https://vjudge.net/problem/POJ-3009

转载于:https://www.cnblogs.com/Ash-ly/p/5728439.html

题目大意:

要求把一个冰壶从起点“2”用最少的步数移动到终点“3”,其中0为移动区域,1为石头区域,冰壶一旦想着某个方向运动就不会停止,也不会改变方向(想想冰壶在冰上滑动),除非冰壶撞到石头1 或者 到达终点 3

需要注意的是:

冰壶撞到石头后,冰壶会停在石头前面,此时(静止状态)才允许改变冰壶的运动方向,而该块石头会破裂,石头所在的区域由1变为0. 也就是说,冰壶撞到石头后,并不会取代石头的位置。

终点是一个摩擦力很大的区域,冰壶若到达终点3,就会停止在终点的位置不再移动。并且,如果步数>10,则直接算失败,这条dfs搜索路径直接舍弃。

解题分析:
此题主要注意的是冰壶向某一个方向前进的时候,如果没有遇到障碍物或者是终点,则继续向该方向不断前进,将这一点转换为代码,其它的就与普通的dfs类似。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = ;
int map[MAXN + ][MAXN + ];
int stepX[] = { -, , , };//四个方向:上、下、左、右
int stepY[] = { , , -, };
int ans;//最短步数
int w, h;//w 为宽度(y) ,h为高度(x),注意下
int stX, stY, edX, edY;//开始时“2”的位置和“3”的位置坐标 int check(int x, int y) {//返回 非2 代表可以往这个方向走 返回 非1 代表会停下来
if (map[x][y] == || map[x][y] == ) return ;
else if (map[x][y] == - || map[x][y] == ) return ;//出界或者有障碍物
else return ;
} void backtrack(int x, int y, int t) {
if (x == edX && y == edY || t > ) {//到达终点或者深度大于10
ans = (t < ans ? t : ans);//更新最短步数
}
else {
for (int i = ; i < ; i++) {//往四个方向试探
int tx = x, ty = y;
if (check(tx + stepX[i], y + stepY[i]) != ) { //可以往当前方向运动
while (check(tx + stepX[i], ty + stepY[i]) == ) { //没有障碍物 或 未到达终点的话就一直运动下去
tx += stepX[i], ty += stepY[i];
}
if (map[tx + stepX[i]][ty + stepY[i]] == ) {//遇到障碍物停止运动
map[tx + stepX[i]][ty + stepY[i]] = ;//击碎障碍物
t++; //步数加1
backtrack(tx, ty, t);//继续从障碍物前一个格子开始走
--t; //回溯时恢复现场
map[tx + stepX[i]][ty + stepY[i]] = ;
}
else if (map[tx + stepX[i]][ty + stepY[i]] == ) {//遇到终点停止运动
t++;
backtrack(tx + stepX[i], ty + stepY[i], t);
}
}
}
}
} int main() {
while (scanf("%d%d", &w, &h), w || h) {
memset(map, -, sizeof(map));
stX = stY = edX = edY = -;
for (int i = ; i <= h; i++) {
for (int j = ; j <= w; j++) {
scanf("%d", &map[i][j]);
if (map[i][j] == ) stX = i, stY = j; //起点
else if (map[i][j] == ) edX = i, edY = j;//终点
}
}
ans = MAXN;
backtrack(stX, stY, );
printf("%d\n", ans > ? - : ans);
}
return ;
}

2018-05-27

poj 3009 冰球 【DFS】求最小步数的更多相关文章

  1. POJ 1753 Flip Game (高斯消元 枚举自由变元求最小步数)

    题目链接 题意:4*4的黑白棋,求把棋全变白或者全变黑的最小步数. 分析:以前用状态压缩做过. 和上题差不多,唯一的不同是这个终态是黑棋或者白棋, 但是只需要把给的初态做不同的两次处理就行了. 感觉现 ...

  2. ZOJ 3593 One Person Game(拓展欧几里得求最小步数)

    One Person Game Time Limit: 2 Seconds      Memory Limit: 65536 KB There is an interesting and simple ...

  3. One Person Game(扩展欧几里德求最小步数)

    One Person Game Time Limit: 2 Seconds      Memory Limit: 65536 KB There is an interesting and simple ...

  4. POJ 3185 The Water Bowls (高斯消元 求最小步数)

    题目链接 题意:有20个数字,0或1.如果改变一个数的状态,它左右两边的两个数的状态也会变反.问从目标状态到全0,至少需要多少次操作. 分析: 和上一题差不多,但是比上一题还简单,不多说了,但是在做题 ...

  5. HDU 1104 Remainder (BFS求最小步数 打印路径)

    题目链接 题意 : 给你N,K,M,N可以+,- ,*,% M,然后变为新的N,问你最少几次操作能使(原来的N+1)%K与(新的N)%k相等.并输出相应的操作. 思路 : 首先要注意题中给的%,是要将 ...

  6. POJ 3009 深度优先搜索

    问题:打冰球.冰球可以往上下左右4个方向走,只有当冰球撞到墙时才会停下来,而墙会消失.当冰球紧贴墙时,不能将冰球往那个方向打.冰球出界就当输,超过10次还没将冰球打到目标位置也当输.求用最小次数将冰球 ...

  7. 带你学习BFS最小步数模型

    最小步数模型 一.简介 最小步数模型和最短路模型的区别? 最短路模型:某一个点到另一个点的最短距离(坐标与坐标之间) 最小步数模型:不再是点(坐标),而是状态到另一个状态的转变 BFS难点所在(最短路 ...

  8. POJ 3009 Curling 2.0【带回溯DFS】

    POJ 3009 题意: 给出一个w*h的地图,其中0代表空地,1代表障碍物,2代表起点,3代表终点,每次行动可以走多个方格,每次只能向附近一格不是障碍物的方向行动,直到碰到障碍物才停下来,此时障碍物 ...

  9. POJ 3009 Curling 2.0(DFS + 模拟)

    题目链接:http://poj.org/problem?id=3009 题意: 题目很复杂,直接抽象化解释了.给你一个w * h的矩形格子,其中有包含一个数字“2”和一个数字“3”,剩下的格子由“0” ...

随机推荐

  1. CDH集群中YARN的参数配置

    CDH集群中YARN的参数配置 前言:Hadoop 2.0之后,原先的MapReduce不在是简单的离线批处理MR任务的框架,升级为MapReduceV2(Yarn)版本,也就是把资源调度和任务分发两 ...

  2. windows钩子函数

    一 什么时候用到钩子?(when)Windows操作系统是建立在事件驱动的消息处理机制之上,系统各部分之间的沟通也都是通过消息的相互传递而实现的.通常情况下,应用程序只能处理当前进程的消息,如果需要对 ...

  3. Android开发技巧——ViewPager加View情况封装PagerAdapter的实现类

    ViewPager是Android的support库中的一个控件. ViewPager + Fragment的使用,已经有FragmentAdapter的实现可以帮助我们快速进行开发了: ViewPa ...

  4. Shiro简介及入门(四)

    1.1     什么是shiro shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证.用户授权. spring中有spring security (原名Acegi),是一个权 ...

  5. Informatic学习总结_day01

    1.forlder 必须open之后才出现  mapping的界面 2.Source Qualifer 3.小技巧 验证自己写的转换格式是否正确 提前过滤一些数据,informatica工具的本质也是 ...

  6. ubuntu + usb转RS232驱动

    1. 购买USB转串RS232/485/422 如果你的电脑有串口的话,就不用买啦,我的台式机有串口,把USB转串的线插上之后,unbuntu就不支持了.(自己有嘛) 就是输入  ls /dev/tt ...

  7. k64 datasheet学习笔记3---Chip Configuration之Clock modules

    1.前言 本文主要讲述chip configure之clock配置相关的内容,主要包含如下三个部分: MCG configuration:Multipurpose clock generator OS ...

  8. Python3学习笔记25-logging模块

    logging模块,Python自带用来记录日志的模块. 因为工作需要用到关于日志的,最近一直都在看关于日志模块的东西,百度了很多文章,可惜都是看的让人一头雾水,最后运气不错,找到一篇很详细的文章.传 ...

  9. WPF当中StaticResource调用方法

    1.先在Converter命名空间当中,定义转换功能类: public sealed class BoolToValueConverter : System.Windows.Data.IValueCo ...

  10. freeswitch用户整合(使用mysql数据库的用户表)

    转:freeswitch用户整合(使用mysql数据库的用户表) freeswitch是一款强大的voip服务器,可以语音和视频.但是它默认是采用/directory文件夹下的xml来配置用户的,对于 ...