-->Curling 2.0

直接上中文

Descriptions:

今年的奥运会之后,在行星mm-21上冰壶越来越受欢迎。但是规则和我们的有点不同。这个游戏是在一个冰游戏板上玩的,上面有一个正方形网格。他们只用一块石头。游戏的目的是让石子从起点到终点,并且移动的次数最小

图1显示了一个游戏板的例子。一些正方形格子可能被砖块占据。有两个特殊的格子,起始点和目标点,这是不占用块。(这两个方块是不同的)一旦石头开始移动就不会停下,除非它击中砖块块。为了使石头到达终点,你可以通过让石块击中墙壁或者砖块来停下。

图1:例子(S:开始,G:目标)

石头的运动遵循以下规则:

  • 开始时,石头静止起点广场上。
  • 石头的运动仅限于x和y方向。禁止对角线移动。
  • 当石头静止时,你可以让他向任意方向移动,除非它移动的方向上有砖块(图2(a))。
  • 一旦抛出,石头不断向同一方向移动,直到下列事件之一发生:
    • 石头击中砖块(图2(b),(c))。.

      • 石头停在他击中的砖块之前
      • 被击中的砖块消失
    • 石块飞出游戏板之外。
      • 游戏结束的条件
    • 到达目标点
      • 石头停在目标点游戏成功
  • 不能在十步之内到达目标点则返回失败。

Fig. 2: Stone movements

通过这些规则我们想知道,石头是否能够到达目标点和最少移动次数

初始配置如图1所示,石头从开始到目标需要4次移动。路线如图3所示(a)。注意当石头到达目标时,游戏版的配置如图3(b)改变。

图3:图1的解决方案和解决之后的结果。

Input

输入是一组数据。输入结束标志为两个0。数据组的数量不超过100。

每个数据集如下展示

板的宽度(w)和高度(h) 
游戏版的第一行 
... 
游戏版的h-th行

版的宽和高满足: 2 <= w <= 20, 1 <= h <= 20.

每行由一个空格分隔的十进制数字组成。该数字描述相应的格子的状态。

1 砖块

2 开始点

3 目标点

图. D-1数据如下:

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

对于每个数据,打印一个十进制整数的行,表示从开始到目标的路径的最小移动次数。如果没有这样的路线,打印- 1。每个行不应该有这个数字以外的任何字符。


Sample Input

2 1
3 2
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
6 1
1 1 2 1 1 3
6 1
1 0 2 1 1 3
12 1
2 0 1 1 1 1 1 1 1 1 1 3
13 1
2 0 1 1 1 1 1 1 1 1 1 1 3
0 0

Sample Output

1
4
-1
4
10
-1

题目连接:

https://vjudge.net/problem/POJ-3009

dfs+回溯的变形 把每次走一步变成每次走一大行即可

具体看代码

AC代码:

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <sstream>
#define mod 1000000007
#define eps 1e-6
#define ll long long
#define INF 0x3f3f3f3f
#define MEM(x,y) memset(x,y,sizeof(x))
#define Maxn 25
using namespace std;
int h,w;//横纵坐标
int sx,sy,ex,ey;//起点 终点坐标
int ans;
int mp[Maxn][Maxn];
int dt[][]= {{,},{-,},{,},{,-}};//4个方向
void dfs(int x,int y,int step) //在(x, y)位置上的步数step
{
if(x==ex&&y==ey)//到达终点
{
if(step<ans)//若有更小值
ans=step;
return;
}
if(step==||step>=ans)//若超过10步,或超过当前最短步数
return;
for(int i=; i<; i++)//四个方向搜索
{
int tx=dt[i][]+x;
int ty=dt[i][]+y;
while(tx>=&&tx<h&&ty>=&&ty<w&&mp[tx][ty]!=)//若此方向能走,则走到尽头,直至出场或撞墙
{
if(tx==ex&&ty==ey)//若在过程中到达目标点
{
step++;
if(step<ans)
ans=step;
return;
}
tx+=dt[i][];
ty+=dt[i][];
}
if((tx==x+dt[i][]&&ty==y+dt[i][])||tx<||tx>=h||ty<||ty>=w)//此方向不能走,或出场
continue;
mp[tx][ty]=;//撞墙
step++;
dfs(tx-dt[i][],ty-dt[i][],step);
step--;//回溯
mp[tx][ty]=;
}
}
int main()
{
while(cin>>w>>h,w+h)
{
ans=;//初始化
MEM(mp,);
for(int i=; i<h; i++)
for(int j=; j<w; j++)
{
cin>>mp[i][j];
if(mp[i][j]==)
{
sx=i;
sy=j;
mp[sx][sy]=;
}
if(mp[i][j]==)
{
ex=i;
ey=j;
}
}
dfs(sx,sy,);//搜索
if(ans==)
cout<<-<<endl;
else
cout<<ans<<endl;
}
}

【POJ - 3009】Curling 2.0 (dfs+回溯)的更多相关文章

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

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

  2. poj 3009 Curling 2.0( dfs )

    题目:http://poj.org/problem?id=3009 参考博客:http://www.cnblogs.com/LK1994/ #include <iostream> #inc ...

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

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

  4. poj 3009 Curling 2.0 (dfs )

    Curling 2.0 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11879   Accepted: 5028 Desc ...

  5. 【POJ】3009 Curling 2.0 ——DFS

    Curling 2.0 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11432   Accepted: 4831 Desc ...

  6. POJ 3009 Curling 2.0 {深度优先搜索}

    原题 $On Planet MM-21, after their Olympic games this year, curling is getting popular. But the rules ...

  7. Curling 2.0(dfs回溯)

    Curling 2.0 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15567   Accepted: 6434 Desc ...

  8. POJ 3009 Curling 2.0 回溯,dfs 难度:0

    http://poj.org/problem?id=3009 如果目前起点紧挨着终点,可以直接向终点滚(终点不算障碍) #include <cstdio> #include <cst ...

  9. poj 3009 Curling 2.0

    题目来源:http://poj.org/problem?id=3009 一道深搜题目,与一般搜索不同的是,目标得一直往一个方向走,直到出界或者遇到阻碍才换方向. 1 #include<iostr ...

  10. 【原创】poj ----- 3009 curling 2 解题报告

    题目地址: http://poj.org/problem?id=3009 题目内容: Curling 2.0 Time Limit: 1000MS   Memory Limit: 65536K Tot ...

随机推荐

  1. Winforms界面开发DevExpress v19.2:图表、编辑器功能增强

    DevExpress Winforms Controls 内置140多个UI控件和库,完美构建流畅.美观且易于使用的应用程序.无论是Office风格的界面,还是分析处理大批量的业务数据,DevExpr ...

  2. Hadoop-No.13之数据源系统以及数据结构

    文件系统中采集数据时,应该考虑以下内容. 数据源系统设备的读取速率 在所有处理流水线中,磁盘I/O通常都是主要瓶颈.但是优化采集流程时通常要看一下检索数据的系统系统.一般来说,Hadoop的读取速度在 ...

  3. 浅析flex 布局

    Flex基本概念: 容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis).主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end: ...

  4. ip 转发(调度器的路由转发)

    临时开启 [root@proxy ~]# echo > /proc/sys/net/ipv4/ip_forward 永久开启 [root@proxy ~]# vim /etc/sysctl.co ...

  5. JVM之Java类加载机制

    什么是类加载机制 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这既是虚拟机的类加载机制 类的生命周期 生命周期简述 ...

  6. [ubuntu] 外挂硬盘

    1. 查看磁盘信息 fdisk -l 这里我需要对sda进行分区,所以要进到sda中 2. 进到欲分区磁盘中 $ sudo fdisk /dev/sda Welcome to fdisk (util- ...

  7. Inter IPP+ VS + opencv 在 Windows下的环境搭建

    首先Inter官网申请和下载:https://software.intel.com/en-us/intel-ipp 需要VS2013或更高版本(先装vs再装IPP,我的版本是VS2015社区版,IPP ...

  8. easyUI的datagrid控件日期列格式化

    转自:https://blog.csdn.net/idoiknow/article/details/8136093 EasyUI是一套比较轻巧易用的Jquery控件,在使用过程中遇到一个问题,它的列表 ...

  9. svn 双备份

    svn备份的方式有三种: 1svnadmin dump 2)svnadmin hotcopy 3)svnsync.  优缺点分析============== 第一种svnadmin dump是官方推荐 ...

  10. 在SpringBoot程序中记录日志

    所有的项目都会有日志,日志文件是用于记录系统操作事件的记录文件或文件集合,可分为事件日志和消息日志.具有处理历史数据.诊断问题的追踪以及理解系统的活动等重要作用.这节描述如何用springboot记录 ...