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. 转 http://www.5icool.org/a/201106/a654.html CSS开发中常用的公用样式

    overflow:hidden 隐藏溢出 一.自己总结的公用样式解析 html, body, div, p, ul, li, dl, dt, dd, h1, h2, h3, h4, h5, h6, f ...

  2. C# System.Diagnostics.Stopwatch 类

    测量一个时间间隔的运行时间 a.调用 Start 方法 b.调用 Stop 方法 c.使用 Elapsed 属性检查运行时间. 如: System.Diagnostics.Stopwatch stop ...

  3. Uva---10881 Piotr's Ants(蚂蚁)

    Problem DPiotr's AntsTime Limit: 2 seconds "One thing is for certain: there is no stopping them ...

  4. uva 10118

    10118 - Free Candies Time limit: 30.000 seconds Little Bob is playing a game. He wants to win some c ...

  5. BZOJ3695 滑行

    转化模型就变成几层折射率不同的玻璃光要怎么走才能从(0, 0)到(x, y) 我们发现第一次光线射出去的角度确定,之后光的行程是确定的 而且角度和最后到达y时的x成正相关,于是可以二分! 然后物理学学 ...

  6. EFCode First 导航属性

    首先谈谈自己对EF的接触的过程吧,最先接触EF只是因为EF支持从数据库把关系扒下来,可以省掉自己写Select.Update.Insert这些SQL语句,而且修改非常方便,后来在使用的过程中发现导航属 ...

  7. 学习记录014-ssh批量分发

    一.ssh服务介绍 1.ssh安全的加密协议用于远程连接服务器 2.默认端口是22,安全协议版本ssh2,它能同时支持RSA和DSA秘钥,SSH1只支持RSA 3.服务端主要包含两个服务功能ssh远程 ...

  8. 对于服务器的识别的条件,header之类的使用

    根据上一节的内容的衔接 一:urllib.request的使用 headers的一些属性 User-Agent : 有些服务器或 Proxy 会通过该值来判断是否是浏览器发出的请求Content-Ty ...

  9. Arithmetic Progressions

    题目大意: 求出满足条件A的等差数列: A:长度为N(N<=25),每个元素都能表示成 两个数p,q的平方和(0<=p,q<=m<=250): 解题过程: 1.处理出所有的能拆 ...

  10. C# DES加密

    需要引用名称空间 using System; using System.Text; using System.Security.Cryptography; using System.IO; 具体代码: ...