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 题目大意:冰壶在冰上可以不停的滑下去,直到碰到障碍物,导致的结果是冰壶静止在障碍物的前一个位置并且障碍物消失。冰壶每静止一次就需要人力来“投掷”一次。一张图,0表示冰,1表示障碍物,问冰壶从起点到终点最少需要几次“投掷”。
题目分析:DFS。模拟这个过程就行了。 代码如下:
 # include<iostream>
# include<cstdio>
# include<queue>
# include<cstring>
# include<algorithm>
using namespace std; int r,c,mp[][]; int ans;
void dfs(int x,int y,int k)
{
if(k>)
return ;
if(mp[x-][y]!=){
for(int nx=x-;nx>=;--nx){
if(mp[nx][y]==){
ans=min(ans,k+);
break ;
}
if(mp[nx][y]==){
mp[nx][y]=;
dfs(nx+,y,k+);
mp[nx][y]=;
break ;
}
}
}
if(mp[x+][y]!=){
for(int nx=x+;nx<r;++nx){
if(mp[nx][y]==){
ans=min(ans,k+);
break ;
}
if(mp[nx][y]==){
mp[nx][y]=;
dfs(nx-,y,k+);
mp[nx][y]=;
break ;
}
}
}
if(mp[x][y-]!=){
for(int ny=y-;ny>=;--ny){
if(mp[x][ny]==){
ans=min(ans,k+);
break;
}
if(mp[x][ny]==){
mp[x][ny]=;
dfs(x,ny+,k+);
mp[x][ny]=;
break;
}
}
}
if(mp[x][y+]!=){
for(int ny=y+;ny<c;++ny){
if(mp[x][ny]==){
ans=min(ans,k+);
break;
}
if(mp[x][ny]==){
mp[x][ny]=;
dfs(x,ny-,k+);
mp[x][ny]=;
break;
}
}
}
}
int main()
{
//freopen("POJ-3009 Curling 2.0.txt","r",stdin);
while(scanf("%d%d",&c,&r),r+c)
{
int sx,sy;
for(int i=;i<r;++i){
for(int j=;j<c;++j){
scanf("%d",&mp[i][j]);
if(mp[i][j]==){
sx=i,sy=j;
mp[i][j]=;
}
}
}
ans=;
dfs(sx,sy,);
if(ans>)
printf("-1\n");
else
printf("%d\n",ans);
}
return ;
}

POJ-3009 Curling 2.0 (DFS)的更多相关文章

  1. poj 3009 Curling 2.0 (dfs )

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

  2. POJ3009:Curling 2.0(dfs)

    http://poj.org/problem?id=3009 Description On Planet MM-21, after their Olympic games this year, cur ...

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

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

  4. POJ3009 Curling 2.0(DFS)

    题目链接. 分析: 本题BFS A不了. 00100 00001 01020 00000 00010 00010 00010 00010 00030 对于这样的数据,本来应当是 5 步,但bfs却 4 ...

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

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

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

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

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

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

  8. POJ 3009-Curling 2.0(DFS)

    Curling 2.0 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12158   Accepted: 5125 Desc ...

  9. poj3009 Curling 2.0 (DFS按直线算步骤)

    Curling 2.0 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14563   Accepted: 6080 Desc ...

随机推荐

  1. JS实现仿腾讯微博无刷新删除微博效果代码

    这里演示JS仿腾讯微博无刷新删除效果,将显示在微博列表里的内容删除,运用AJAX技术,无刷新删除微博的内容,参考性强,希望对初学AJAX的朋友有所帮助. 在线演示地址如下: http://demo.j ...

  2. java copy 文件夹

    import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io ...

  3. [转载]论asp.net out、ref、return

      论asp.net out.ref.return ref(引用类型) ref引用类型进出都必须赋值,赋值后会改变类型原来的指针.   out(值类型) out值类型进可以不赋值,出必须赋值.   r ...

  4. MySQL数据库----单表查询

    先创建表 #创建表 create table employee( id int not null unique auto_increment, name varchar(20) not null, s ...

  5. MySQL笔记(三)由txt文件导入数据

    改编自学校实验,涉及一些字符集相关的问题. 索引 建库 导入数据 最终脚本 下载数据 点击这里 建库 create.sql DROP DATABASE IF EXISTS orderdb; CREAT ...

  6. python3 isinstance()判断元素是否是字符串、int型、float型

    python3 isinstance()判断元素是否是字符串.int型.float型 isinstance是Python中的一个内建函数 语法: isinstance(object, classinf ...

  7. Python3.x(windows系统)安装requests库

    Python3.x(windows系统)安装requests库 cmd命令: pip install requests 执行结果:

  8. 20145105 《Java程序设计》第8周学习总结

    20145105 <Java程序设计>第8周学习总结 教材学习内容总结 第十五章 通用API 一.日志 (一)日志API简介 java.util.logging:提供日志功能相关类与接口 ...

  9. win10中mount和unmount iso文件

    https://www.windowscentral.com/how-mount-or-unmount-iso-images-windows-10 You can also right-click t ...

  10. 【第二章】 第二个spring-boot程序

    上一节的代码是spring-boot的入门程序,也是官方文档上的一个程序.这一节会引入spring-boot官方文档推荐的方式来开发代码,并引入我们在spring开发中service层等的调用. 1. ...