在行星MM-21上,今年奥运会之后,冰壶(curling)越来越受欢迎。  但规则与我们有所不同。 该游戏是在冰盘上进行的,在冰棋盘上标有方形网格。他们只用一块石头。 游戏的目的是以最少的动作( the minimum number of moves.)让石头从开始到目标位置。

Fig. 1 是游戏板的示例。 一些方块可能被石块占据。  有两个特殊的方格即开始和目标,没有被块占据。 (这两个方块是不同的。)这两个方块是不同的。)一旦石头开始移动,它将继续进行,直到它撞到一个石块。为了把石头带到目标位置,你可能必须通过击中石块来阻止石块,并重新抛出。


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

石头的运动遵从以下规则:

  • 一开始,石头会在起始方块。
  • 石头的运动限于x和y方向。 对角线移动是禁止的。
  • 当石头静止时,你可以通过扔它移动。 除非立即被阻止,否则您可以将其扔到任何方向(图2(a))。
  • 一旦投掷,石头会继续向同一方向移动,直到发生以下情况之一:
    • 石头撞上一块(图2(b),(c))。
    • 石头停在撞击它的石块的旁边的正方形上。.
      • 石块消失
    • 石块从木板上掉出来
      • 游戏结束
    • 石头到达目标位置
      • 石头停在那里,游戏结束了。
  • 你不能在比赛中扔石头10次以上。 如果石头在10次移动中没有达到目标,游戏就会失败。


Fig. 2: Stone movements

根据规则(under the rules),我们想知道一开始的石头是否可以达到目标,如果是,则需要最少的移动次数。

在图1所示的初始配置中,需要4次移动才能将石头从开始位置移动到目标位置。 路线如图3(a)所示。 注意当石头到达目标时,游戏板配置如图3(b)所示。


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

Input

输入是一系列数据集。 输入的结尾由包含由空格分隔的两个零的行指示。 数据集的数量从不超过100。

每个数据集格式如下。

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

板的宽度和高度满足:2 < = w < = 20,1 < = h < = 20。

每一行都由一个空格分隔的w十进制数组成。这个数字描述了相应的正方形的状态。

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

对于每个数据集,打印一行有一个十进制整数,表示从开始到目标的路线的最小移动数。如果没有这样的路由,则输出- 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
 #include<iostream>
#include<cstdio>
using namespace std;
const int MAX_N = ;
const int INF = <<;
int board[MAX_N][MAX_N];
/*四个方向*/
int dx[] = {,-,,};
int dy[] = {,,,-};
int w,h,bx,by,ex,ey,mintimes;
void solve(int row ,int col,int count)
{
if(count == && board[row][col] != ) //移动次数超10次并且没有到达终点
return ;
else if(board[row][col] == ) //到达终点位置
{
mintimes = min(mintimes,count); //找最小的移动次数
return;
}
for(int i = ; i < ; i++)
{
int ny = row + dy[i];
int nx = col + dx[i];
if(nx >= && ny >= && nx < w && ny < h) //确定冰壶在网格内
{
if(board[ny][nx] == ) continue; //遇到石块
while(nx >= && ny >= && nx < w && ny < h && board[ny][nx] != &&board[ny][nx] != )
{
ny += dy[i];
nx += dx[i];
}
if(nx < || nx >= w || ny < || ny >= h) continue; //飞出冰盘
int temp = board[ny][nx];
int x = nx,y = ny;
if(board[ny][nx] == )
{
board[ny][nx] = ;
ny -= dy[i];
nx -= dx[i];
}
solve(ny,nx,count+);
board[y][x] = temp; //回复原来状态 }
}
}
int main()
{
while(cin>>w>>h,w||h)
{
for(int i =; i < h;i++)
for(int j = ; j < w;j++)
{
scanf("%d",&board[i][j]);
/*标记开始位置和结束位置*/
if(board[i][j] == )
{
bx = j;
by = i;
}else if(board[i][j] == ){
ex = j;
ey = i;
}
}
mintimes = INF;
solve(by,bx,);
if(mintimes == INF)
cout<<"-1"<<endl;
else
cout<<mintimes<<endl; }
return ;
}

ACM 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. POJ3009——Curling 2.0(DFS)

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

  3. poj 3009 Curling 2.0 (dfs )

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

  4. 【POJ】3009 Curling 2.0 ——DFS

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

  5. Curling 2.0(dfs回溯)

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

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

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

  7. POJ 3009:Curling 2.0 推箱子

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

  8. POJ-3009 Curling 2.0 (DFS)

    Description On Planet MM-21, after their Olympic games this year, curling is getting popular. But th ...

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

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

随机推荐

  1. 复习HTML+CSS(3)

    n  超级链接 l  语法格式:<a 属性 = "值">---</a> l  常用属性: n  Href:目标文件的地址URL,该URL可以是相对地址,也可 ...

  2. Django:(博客系统)使用使用mysql数据&创建post/category/tag实体,并同步到数据中

    背景: 之前也读过一些关于django的一些书,看过别人写的一些博客系统.但是总有一种看别人的都会,但自己写不出来的感觉,于是为了加深对django的学习就开始动手学习了. 环境搭建: 环境:使用py ...

  3. eclipse下如何使用Hibernate反转工程生与数据库对应的实体类和映射文件(以MySQL为例)

    首先需要为eclipse添加对Hibernate的支持(也就是下载的Hibernate中的jar包),下载方法另查,这里不多做阐述. 想要使用反转工程,首先要下载Hibernate反转工程的插件Jbo ...

  4. [LeetCode] K Inverse Pairs Array K个翻转对数组

    Given two integers n and k, find how many different arrays consist of numbers from 1 to n such that ...

  5. xcode8的那些坑儿

    前几天手又贱,更新了xcode8....被几个坑玩坏了.最起码,字体改了,我现在还没有适应.下面列举了这两天遇到的问题 1.关于相册,照相,通讯录,麦克风的权限问题 xcode8打完包安装后,你会发现 ...

  6. python爬虫——爬取小说 | 探索白子画和花千骨的爱恨情仇(转载)

    转载出处:药少敏   ,感谢原作者清晰的讲解思路! 下述代码是我通过自己互联网搜索和拜读完此篇文章之后写出的具有同样效果的爬虫代码: from bs4 import BeautifulSoup imp ...

  7. GCD(ZYYS)

    [问题描述]在山的那边.海的那边有 n 个小矮人,他们生存的意义就是要保护他们的精神领袖——GCD.有一天,他们收到了一封恐吓信,说要在一个遥远的地方用维纳斯之箭射击 GCD,让他变成一根面条,n 个 ...

  8. ●BZOJ 3529 [Sdoi2014]数表

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3529 题解: 莫比乌斯反演. 按题目的意思,令$f(i)$表示i的所有约数的和,就是要求: ...

  9. 【USACO】 奶牛会展

    题目背景 奶牛想证明它们是聪明而风趣的.为此,贝西筹备了一个奶牛博览会,她已经对N 头奶牛进行 了面试,确定了每头奶牛的智商和情商. 题目描述 贝西有权选择让哪些奶牛参加展览.由于负的智商或情商会造成 ...

  10. 【LSGDOJ1836】: 量化交易 贪心

    题目描述 applepi 训练了一个可以自动在股票市场进行量化交易的模型.通常来说,applepi 写出的模型,你懂得,就好比一架印钞机.不过为了谨慎起见,applepi还是想先检查一下模型的效果.a ...