【POJ - 3009】Curling 2.0 (dfs+回溯)
-->Curling 2.0
直接上中文
Descriptions:
今年的奥运会之后,在行星mm-21上冰壶越来越受欢迎。但是规则和我们的有点不同。这个游戏是在一个冰游戏板上玩的,上面有一个正方形网格。他们只用一块石头。游戏的目的是让石子从起点到终点,并且移动的次数最小
图1显示了一个游戏板的例子。一些正方形格子可能被砖块占据。有两个特殊的格子,起始点和目标点,这是不占用块。(这两个方块是不同的)一旦石头开始移动就不会停下,除非它击中砖块块。为了使石头到达终点,你可以通过让石块击中墙壁或者砖块来停下。
图1:例子(S:开始,G:目标)
石头的运动遵循以下规则:
- 开始时,石头静止起点广场上。
- 石头的运动仅限于x和y方向。禁止对角线移动。
- 当石头静止时,你可以让他向任意方向移动,除非它移动的方向上有砖块(图2(a))。
- 一旦抛出,石头不断向同一方向移动,直到下列事件之一发生:
- 石头击中砖块(图2(b),(c))。.
- 石头停在他击中的砖块之前
- 被击中的砖块消失
- 石块飞出游戏板之外。
- 游戏结束的条件
- 到达目标点
- 石头停在目标点游戏成功
- 石头击中砖块(图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+回溯)的更多相关文章
- POJ 3009 Curling 2.0(DFS + 模拟)
题目链接:http://poj.org/problem?id=3009 题意: 题目很复杂,直接抽象化解释了.给你一个w * h的矩形格子,其中有包含一个数字“2”和一个数字“3”,剩下的格子由“0” ...
- poj 3009 Curling 2.0( dfs )
题目:http://poj.org/problem?id=3009 参考博客:http://www.cnblogs.com/LK1994/ #include <iostream> #inc ...
- POJ 3009 Curling 2.0【带回溯DFS】
POJ 3009 题意: 给出一个w*h的地图,其中0代表空地,1代表障碍物,2代表起点,3代表终点,每次行动可以走多个方格,每次只能向附近一格不是障碍物的方向行动,直到碰到障碍物才停下来,此时障碍物 ...
- poj 3009 Curling 2.0 (dfs )
Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11879 Accepted: 5028 Desc ...
- 【POJ】3009 Curling 2.0 ——DFS
Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11432 Accepted: 4831 Desc ...
- POJ 3009 Curling 2.0 {深度优先搜索}
原题 $On Planet MM-21, after their Olympic games this year, curling is getting popular. But the rules ...
- Curling 2.0(dfs回溯)
Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15567 Accepted: 6434 Desc ...
- POJ 3009 Curling 2.0 回溯,dfs 难度:0
http://poj.org/problem?id=3009 如果目前起点紧挨着终点,可以直接向终点滚(终点不算障碍) #include <cstdio> #include <cst ...
- poj 3009 Curling 2.0
题目来源:http://poj.org/problem?id=3009 一道深搜题目,与一般搜索不同的是,目标得一直往一个方向走,直到出界或者遇到阻碍才换方向. 1 #include<iostr ...
- 【原创】poj ----- 3009 curling 2 解题报告
题目地址: http://poj.org/problem?id=3009 题目内容: Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Tot ...
随机推荐
- Winforms界面开发DevExpress v19.2:图表、编辑器功能增强
DevExpress Winforms Controls 内置140多个UI控件和库,完美构建流畅.美观且易于使用的应用程序.无论是Office风格的界面,还是分析处理大批量的业务数据,DevExpr ...
- Hadoop-No.13之数据源系统以及数据结构
文件系统中采集数据时,应该考虑以下内容. 数据源系统设备的读取速率 在所有处理流水线中,磁盘I/O通常都是主要瓶颈.但是优化采集流程时通常要看一下检索数据的系统系统.一般来说,Hadoop的读取速度在 ...
- 浅析flex 布局
Flex基本概念: 容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis).主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end: ...
- ip 转发(调度器的路由转发)
临时开启 [root@proxy ~]# echo > /proc/sys/net/ipv4/ip_forward 永久开启 [root@proxy ~]# vim /etc/sysctl.co ...
- JVM之Java类加载机制
什么是类加载机制 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这既是虚拟机的类加载机制 类的生命周期 生命周期简述 ...
- [ubuntu] 外挂硬盘
1. 查看磁盘信息 fdisk -l 这里我需要对sda进行分区,所以要进到sda中 2. 进到欲分区磁盘中 $ sudo fdisk /dev/sda Welcome to fdisk (util- ...
- Inter IPP+ VS + opencv 在 Windows下的环境搭建
首先Inter官网申请和下载:https://software.intel.com/en-us/intel-ipp 需要VS2013或更高版本(先装vs再装IPP,我的版本是VS2015社区版,IPP ...
- easyUI的datagrid控件日期列格式化
转自:https://blog.csdn.net/idoiknow/article/details/8136093 EasyUI是一套比较轻巧易用的Jquery控件,在使用过程中遇到一个问题,它的列表 ...
- svn 双备份
svn备份的方式有三种: 1svnadmin dump 2)svnadmin hotcopy 3)svnsync. 优缺点分析============== 第一种svnadmin dump是官方推荐 ...
- 在SpringBoot程序中记录日志
所有的项目都会有日志,日志文件是用于记录系统操作事件的记录文件或文件集合,可分为事件日志和消息日志.具有处理历史数据.诊断问题的追踪以及理解系统的活动等重要作用.这节描述如何用springboot记录 ...