Curling 2.0

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other)
Total Submission(s) : 22   Accepted Submission(s) : 10
Problem Description

On Planet MM-21, after their Olympic games this year, curling is getting popular. But the rules are somewhat different from ours. The game is played on an ice game board on which a square mesh is marked. They use only a single stone. The purpose of the game is to lead the stone from the start to the goal with the minimum number of moves.

Fig. 1 shows an example of a game board. Some squares may be occupied with blocks. There are two special squares namely the start and the goal, which are not occupied with blocks. (These two squares are distinct.) Once the stone begins to move, it will proceed until it hits a block. In order to bring the stone to the goal, you may have to stop the stone by hitting it against a block, and throw again.

Fig. 1: Example of board (S: start, G: goal)

The movement of the stone obeys the following rules:

  • At the beginning, the stone stands still at the start square.
  • The movements of the stone are restricted to x and y directions. Diagonal moves are prohibited.
  • When the stone stands still, you can make it moving by throwing it. You may throw it to any direction unless it is blocked immediately(Fig. 2(a)).
  • Once thrown, the stone keeps moving to the same direction until one of the following occurs:
    • The stone hits a block (Fig. 2(b), (c)).

      • The stone stops at the square next to the block it hit.
      • The block disappears.
    • The stone gets out of the board.
      • The game ends in failure.
    • The stone reaches the goal square.
      • The stone stops there and the game ends in success.
  • You cannot throw the stone more than 10 times in a game. If the stone does not reach the goal in 10 moves, the game ends in failure.

Fig. 2: Stone movements

Under the rules, we would like to know whether the stone at the start can reach the goal and, if yes, the minimum number of moves required.

With the initial configuration shown in Fig. 1, 4 moves are required to bring the stone from the start to the goal. The route is shown in Fig. 3(a). Notice when the stone reaches the goal, the board configuration has changed as in Fig. 3(b).

Fig. 3: The solution for Fig. D-1 and the final board configuration

 
Input

The input is a sequence of datasets. The end of the input is indicated by a line containing two zeros separated by a space. The number of datasets never exceeds 100.

Each dataset is formatted as follows.

the width(=w) and the height(=h) of the board First row of the board ... h-th row of the board

The width and the height of the board satisfy: 2 <= w <= 20, 1 <= h <= 20.

Each line consists of w decimal numbers delimited by a space. The number describes the status of the corresponding square.

0 vacant square
1 block
2 start position
3 goal position

The dataset for Fig. D-1 is as follows:

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

For each dataset, print a line having a decimal integer indicating the minimum number of moves along a route from the start to the goal. If there are no such routes, print -1 instead. Each line should not have any character other than this number.

 
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
 
Source
PKU
 
 
 
 
这道题花了很长时间,原先看到求最短的走法就以为BFS,但发现没有办法压缩状态,后来看了POJ的Discuss才知道要DFS,原来DFS也可是求最短路径。
这题的模拟也很让我头疼。总算写出来了却TLE,后来和别人的代码一对照才知道step超过10时要剪枝。。。最后终于过了居然要157ms。。。。
 
 
#include<iostream>
#include<cstring>
using namespace std; struct pos
{
int x,y;
}; int w,h,Min,step=0;
pos p;
int board[101][101]; void DFS(pos p)
{
int i;
if(step>=10) //step大于等于10时,不能走了,剪枝,回退
return;
if(p.x+1<h&&board[p.x+1][p.y]!=1) //如果下一步不是石头,且不越界,就走试试看
{
step++;
for(i=1;i<h-p.x&&board[i+p.x][p.y]!=1;i++) //一步一步验证是否能到终点,是否碰到石头
{
if(board[i+p.x][p.y]==3) //到达终点,如果step比当前最小值小,保存step的值
{
if(Min>step)
Min=step;
step--;
return;
}
}
if(i<h-p.x) //如果不划出边界
{
board[i+p.x][p.y]=0; //碰到的石头变成空白
p.x+=i-1; //移动到当前位置
DFS(p);
board[p.x+1][p.y]=1;
p.x-=i-1;
}
step--;
}
if(p.x-1>=0&&board[p.x-1][p.y]!=1)
{ step++;
for(i=1;i<=p.x&&board[p.x-i][p.y]!=1;i++)
{
if(board[p.x-i][p.y]==3)
{
if(Min>step)
Min=step;
step--;
return;
}
}
if(i<=p.x)
{
board[p.x-i][p.y]=0;
p.x-=i-1;
DFS(p);
board[p.x-1][p.y]=1;
p.x+=i-1;
}
step--;
}
if(p.y+1<w&&board[p.x][p.y+1]!=1)
{
step++;
for(i=1;i<w-p.y&&board[p.x][p.y+i]!=1;i++)
{
if(board[p.x][p.y+i]==3)
{
if(Min>step)
Min=step;
step--;
return;
}
}
if(i<w-p.y)
{
board[p.x][p.y+i]=0;
p.y+=i-1;
DFS(p);
board[p.x][p.y+1]=1;
p.y-=i-1;
}
step--;
}
if(p.y-1>=0&&board[p.x][p.y-1]!=1)
{
step++;
for(i=1;i<=p.y&&board[p.x][p.y-i]!=1;i++)
{
if(board[p.x][p.y-i]==3)
{
if(Min>step)
Min=step;
step--;
return;
}
}
if(i<=p.y)
{
board[p.x][p.y-i]=0;
p.y-=i-1;
DFS(p);
board[p.x][p.y-1]=1;
p.y+=i-1;
}
step--;
}
return;
} int main()
{
while(cin>>w>>h&&(w+h))
{
Min=11;
int i,j;
step=0;
memset(board,0,sizeof(board));
for(i=0;i<h;i++)
{
for(j=0;j<w;j++)
{
cin>>board[i][j];
if(board[i][j]==2)
{
p.x=i;
p.y=j;
}
}
}
DFS(p);
if(Min==11)
cout<<-1<<endl;
else
cout<<Min<<endl; }
}
 

HDOJ-三部曲一(搜索、数学)-1003-Curling 2.0的更多相关文章

  1. Curling 2.0 分类: 搜索 2015-08-09 11:14 3人阅读 评论(0) 收藏

    Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14289 Accepted: 5962 Descript ...

  2. 51Nod 1003 阶乘后面0的数量(数学,思维题)

    1003 阶乘后面0的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 5         难度:1级算法题 n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720 ...

  3. 【POJ - 3009】Curling 2.0 (dfs+回溯)

    -->Curling 2.0 直接上中文 Descriptions: 今年的奥运会之后,在行星mm-21上冰壶越来越受欢迎.但是规则和我们的有点不同.这个游戏是在一个冰游戏板上玩的,上面有一个正 ...

  4. POJ3009——Curling 2.0(DFS)

    Curling 2.0 DescriptionOn Planet MM-21, after their Olympic games this year, curling is getting popu ...

  5. poj 3009 Curling 2.0 (dfs )

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

  6. 【POJ】3009 Curling 2.0 ——DFS

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

  7. Curling 2.0(dfs回溯)

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

  8. ****Curling 2.0(深搜+回溯)

    Curling 2.0 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Total ...

  9. 1001 数组中和等于K的数对 1002 数塔取数问题 1003 阶乘后面0的数量 1004 n^n的末位数字 1009 数字1的数量

    1001 数组中和等于K的数对 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 给出一个整数K和一个无序数组A,A的元素为N个互不相同的整数,找出数组A中所有和等于K ...

  10. POJ 3009:Curling 2.0 推箱子

    Curling 2.0 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14090   Accepted: 5887 Desc ...

随机推荐

  1. 离线网页制作器(beta1.0)

    package hhuarongdao; /* *使用方法: 先选择保存路径,然后输入相应的网址, *然后会得到那个网页的离线版的 内容 * */ import java.awt.BorderLayo ...

  2. HDUOJ------3336 Count the string(kmp)

    D - Count the string Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64 ...

  3. BZOJ1593 [Usaco2008 Feb]Hotel 旅馆

    裸上线段树,就是记的东西有点多... 每个点记区间左端最长0,右端最长0,中间最长0,和tag表示是否全为0/1 直接更新就好,查询的时候先查左儿子,然后查中间,最后查右儿子... /******** ...

  4. Spring学习(二)——Spring中的AOP的初步理解[转]

      [前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring. ...

  5. 怎么设置 mysql 多主复制

    更新 其实本文主要来自www.digitalocean.com ,但是我没有买他们家的 VPS 用来 demo 了.只是用vagrant 来模拟了. 介绍 说说关于通过两台 vps 来扩展 mysql ...

  6. 使用Chef管理windows集群 | 运维自动化工具

    但凡服务器上了一定规模(百台以上),普通的ssh登录管理的模式就越来越举步维艰.试想Linux发布了一个高危漏洞的补丁,你要把手下成百上千台机器都更新该补丁,如果没有一种自动化方式,那么至少要耗上大半 ...

  7. iOS8 针对开发者所拥有的新特性汇总如下

    iOS8 针对开发者所拥有的新特性汇总如下 1.支持第三方键盘 2.自带网页翻译功能(即在线翻译) 3.指纹识别功能开放:第三方软件可以调用 4.Safari浏览器可直接添加新的插件. 5.可以把一个 ...

  8. ACM心情总结

    已经快要12点了,然而还有5000字概率论论文没有动.在论文里,我本来是想要总结一下ACM竞赛中出现过的概率论题目,然而当敲打第一段前言的时候,我就迟疑了. 我问自己,ACM竞赛到底有什么现实意义. ...

  9. g++默认支持c++11标准的办法

    //第一种,直接包含在源程序文件中,如第一行代码所示 #pragma GCC diagnostic error "-std=c++11" #include <iostream ...

  10. 二模 (1) day2

    第一题: 题目大意: N层楼,K个人,M个箱子在1楼,给出K个人的初始状态(在第几楼,正在向上走还是向下走,向上走的人手里已经有箱子),每次移动一层楼,求把所有箱子(手里拿着的不算在M里)全部搬到顶楼 ...