【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 ...
随机推荐
- ubuntu配置环境变量 sudo gedit /etc/profile
文件末尾加入下面 JAVA_HOME 是jdk主目录 export JAVA_HOME=/usr/jdkexport JRE_HOME=${JAVA_HOME}/jre export CLASSPA ...
- VUE-文本-事件-属性指令
一.Vue文本指令 文本指令: 1.{{ }} 2.v-text:不能解析html语法的文本,会原样输出 3.v-html:能解析html语法的文本 4.v-once:处理的标签的内容只能被解析一次 ...
- 3 触发器报警-->远程执行命令
0.需求 上节课我们讲了,触发器报警,发送邮件,这节课主要讲下远程执行命令 流程图如下 item--> triggers-->action--->Email |——>远 ...
- [Algorithm] Finding Prime numbers - Sieve of Eratosthenes
Given a number N, the output should be the all the prime numbers which is less than N. The solution ...
- webpack5持久化缓存
Opt-in webpack 旨在注重构建安全而非性能.我们没有打算默认启用这一功能,主要原因在于此功能虽然有 95% 几率提升性能,但仍有 5% 的几率中断你的应用程序/工作流/构建. 什么是缓存失 ...
- javascript中的正确错误处理------------引用
JavaScript的事件驱动机制让JavaScript更加丰富,浏览器好比就是一个事件驱动的机器,错误也是一种事件.当一个错误发生时,一个事件就在某个点抛出. 解释起来就是,当发生错误时,JavaS ...
- java中报错:problem with class file or dependent class; nested exception is java.lang.NoClassDefFoundError
今天和往常一样打开项目,竟然报错problem with class file or dependent class; nested exception is java.lang.NoClassDef ...
- AcWing:99. 激光炸弹(前缀和)
一种新型的激光炸弹,可以摧毁一个边长为 RR 的正方形内的所有的目标. 现在地图上有 NN 个目标,用整数Xi,YiXi,Yi表示目标在地图上的位置,每个目标都有一个价值WiWi. 激光炸弹的投放是通 ...
- Xpath中text(),string(),data()的区别
摘要: 在XPath中,经常使用text()和string(),而我一般都是想到哪个用哪个,究竟他们之间有什么不同,没有在意过. 本质区别 text()是一个node test,而string()是一 ...
- 关于web前端开发,区别用户使用的终端设备代码
对web前端开发,熟知不同的浏览器,的解析是基本技能,下面,我就向大家展示一下,如何获得当前用户所用的终端设备.车子一发动,请准备上车................... <script> ...