Curling 2.0(POJ--3009

来源:互联网 发布:淘宝网买手机壳 编辑:程序博客网 时间:2024/06/05 12:00

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.

0vacant square1block2start position3goal 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.

题意:这是一个冰球游戏,在一块冰地上滚球,在冰地上的每个方格里都有一个相应的数字,分别表示着一定的意义,如果该方块上的数字是0,说明冰球可以从这块冰地上滚;如果该方块上的数字是1,则表示该方块上有一块石头,如果冰球碰到该石头那么冰球就会停止,该石头就会消失;如果该方块上的数字是2,表示这是冰球的初始位置;如果该方块上的数字是3,表示这是冰球的终点位置。冰球要是能朝着一个方向运动则会一直运动下去除非碰到石头才会停止或出界。只有当冰球周围有空地时冰球才能移动。(PS:冰球的初始位置和终点位置都是空点无石头。)多组输入。每组输入m和n,分别代表冰地的列数和行数,接下来输入冰地地图。问冰球是否能在十步内从起点到达终点。

如果能则输出最少步数,如果不能则输出-1。

Sample Input

2 13 26 61 0 0 2 1 01 1 0 0 0 00 0 0 0 0 30 0 0 0 0 01 0 0 0 0 10 1 1 1 1 16 11 1 2 1 1 36 11 0 2 1 1 312 12 0 1 1 1 1 1 1 1 1 1 313 12 0 1 1 1 1 1 1 1 1 1 1 30 0

Sample Output

14-1410-1

#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#define MAX 0x3f3f3f3fusing namespace std;int mmap[30][30];                      //存放地图int w,h,ans;int dx[]= {1,0,-1,0};                     //四个方向坐标int dy[]= {0,1,0,-1};void DFS(int sx,int sy,int ex,int ey,int sum){     if(sum>10)                 //如果步数已经超过10步则没必要再走下去        return ;    if(sx==ex&&sy==ey)    {        ans=min(ans,sum);     //取步数最少        return ;    }    for(int i=0; i<4; i++)    {        int xx=sx+dx[i];        int yy=sy+dy[i];        if(xx<0||xx>=h||yy<0||yy>=w)           continue;        if(mmap[xx][yy]==3)          //如果是终点则直接递归下去            DFS(xx,yy,ex,ey,sum+1);        if(mmap[xx][yy]==1)         //如果是石头则不能走向该点            continue;        while(1)        {            xx+=dx[i];            yy+=dy[i];            if(xx>=0&&xx<h&&yy>=0&&yy<w)            {                if(mmap[xx][yy]==1)                {                    mmap[xx][yy]=0;         //石头消失,取消石头标记                    DFS(xx-dx[i],yy-dy[i],ex,ey,sum+1);                    mmap[xx][yy]=1;         //回溯回来,恢复石头标记                    break;                }                else if(mmap[xx][yy]==3)                {                    DFS(xx,yy,ex,ey,sum+1);                }            }            else            break;        }    }}int main(){    //freopen("lalala.text","r",stdin);    int xs,xe,ys,ye;    while(~scanf("%d %d",&w,&h))    {        if(w==0&&h==0)            break;        memset(mmap,-1,sizeof(mmap));        for(int i=0; i<h; i++)            for(int j=0; j<w; j++)            {                scanf("%d",&mmap[i][j]);                if(mmap[i][j]==2)                {                    xs=i;                    ys=j;                }                if(mmap[i][j]==3)                {                    xe=i;                    ye=j;                }            }        //printf("%d %d\n%d %d\n",xs,ys,xe,ye);        ans=MAX;        DFS(xs,ys,xe,ye,0);        if(ans<MAX)            printf("%d\n",ans);        else            printf("-1\n");    }    return 0;}


0 0
原创粉丝点击