冰壶问题

问题: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

回答:题意大概是给定一个m*n的网格,在这些网格上一些地方有障碍物,给定起点与终点的位置,当石头从起点开始走,撞上障碍才会转弯,否则会一直沿着来时的方向继续前进。撞到障碍后停在障碍前的位置,障碍消失。然后石头可以选择四个方向(相邻处无障碍的方向)前进,问至少需要停多少次才能从起点到达终点。不能到达或者多余10步后游戏失败。如果能到达输出最少的步数,否则输出-1.

#include<iostream>
#include<stdio.h>
#include<stdio.h>
#include<string.h>
using namespace std;
int vis[25][25];
int n,m;
int sx,sy,ex,ey;
int flag,sumStep;//flag标记是否找到路径,sumStep记录总的步数
int move[4][2]= {1,0,0,1,-1,0,0,-1}; //移动的方向
void dfs(int x,int y,int step)//当前位置,步数
{
    int tx,ty;
    if(step>=10)
        return ;
    for(int i=0; i<4; i++)
    {
        if(!vis[x+move[i][0]][y+move[i][1]])
        {
            tx=x;
            ty=y;
            while(!vis[tx+move[i][0]][ty+move[i][1]])//判断下一个节点是否是障碍
            {
                tx=tx+move[i][0];//符合条件才加,刚开始直接加了一直没有对
                ty=ty+move[i][1];
                if(tx==ex&&ty==ey)
                {
                    if(sumStep>step+1)
                        sumStep=step+1;
                    flag=1;
                    return ;
                }
                if(tx<0||tx>=n||ty<0||ty>=m)//判断越界
                    break;
            }
            if(tx>=0&&tx<n&&ty>=0&&ty<m&&step+1<10)//与障碍撞上后
            {
                vis[tx+move[i][0]][ty+move[i][1]]=0;//去除障碍
                dfs(tx,ty,step+1);
                vis[tx+move[i][0]][ty+move[i][1]]=1;//回溯
            }
        }
    }
}
int main()
{
    int i,j;
    while(cin>>m>>n)
    {
        if(n==0&&m==0)
            break;
        memset(vis,0,sizeof(vis));
        for(i=0; i<n; i++)
            for(j=0; j<m; j++)
            {
                cin>>vis[i][j];
                if(vis[i][j]==2)
                {
                    sx=i;
                    sy=j;
                    vis[i][j]=0;
                }
                if(vis[i][j]==3)
                {
                    ex=i;
                    ey=j;
                    vis[i][j]=0;
                }
            }
        flag=0;
        sumStep=99999999;
        dfs(sx,sy,0);
        if(!flag)
            cout<<-1<<endl;
        else
            cout<<sumStep<<endl;
    }
    return 0;
}

时间: 2024-08-25 02:36:47

冰壶问题的相关文章

POJCurling 2.0(冰壶游戏)(DFS)

Curling 2.0 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12490   Accepted: 5265 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

(未AC)7-10 冰壶比赛 (30分)

在3月29日举行的女子冰壶世锦赛决赛中,:钟志颖.陈佳衡.叶翰熙和傅琰组成的中国女子冰壶队以8比6击败了冬奥会和世锦赛双冠王瑞典队,夺得了中国冰壶历史上第一枚世锦赛金牌,创造了历史.美丽.实力兼具的中国冰壶姑娘们也赢得了超高的赞誉. 在冰壶比赛中,给出一个目标点P,以及一个规定的正整数r.每一局由甲乙两队轮流投冰壶各8次后,该局比赛结束.此时,哪一方的冰壶最终离目标点P更近,该方得分,另一方不得分.得分方每颗离目标点P距离小于或等于r.位置较另一队所有冰壶都更接近目标点P的冰壶都可以得1分. 比

POJ 3009 Curling 2.0冰壶游戏(dfs)

条件:要移动的方向旁边有障碍物时不能动 来自 http://blog.sina.com.cn/s/blog_7865b08301013fku.html 的代码,感叹下自己代码的渣渣 1 int map[MAX][MAX] ; 2 int h, w , min = INT_MAX ; 3 int sx , sy , ex, ey ; 4 int d[4][2] = {{1,0},{-1,0},{0,1},{0,-1}}; 5 void init(){ 6 for(int i = 0 ;i < h

2017女子冰壶世w

红网常德分站2月23日讯(常德日报记者 童宗锦 通讯员 徐刚)2月12日至13日,湖南省汉寿县第十二届纪委第二次全体会议召开.会议提出,要凝心聚力强监督,全力以赴抓落实,坚决推动全面从严治党向纵深发展.中共汉寿县委书记杨昶出席会议并作重要讲话,县委副书记.县长车世忠,县领导刘毅翔.袁佑清.解以刚.黄治军.曾群.何朝辉.李芳.丁克刚.吴建军.朱进友.李裕军.蔡武等全体在家县级领导出席会议. 红网长沙2月23日讯(时刻新闻记者 杨烊 汤红辉 通讯员 彭景)一部有关爵士乐的好莱坞电影<爱乐之城>正在

2017女子冰壶世y1

湖南省高速公路管理局党委委员.总经济师王辉扬出席会议并讲话,长益扩容公司经理郭一枝作工作报告,长益扩容公司纪委书记王建明对2016年党风廉政建设工作进行了总结. 作为一部将极限运动与国际化明星阵容完美融合的特工动作大片,该片的口碑也随票房的积累持续实力上扬.影片将极限运动与动作戏进行创意结合的形式得到影迷一致认可,观众纷纷用"酷.帅.拽.燃.爽.炸"来形容观影感受,好莱坞硬汉范·迪塞尔一如既往上天下海.无所不能,玩转各项极限运动彰显"范式疯狂".尤其是摩托车水上驰骋

宋人千首绝句【之一】

<千首宋人绝句>是清代严长明编辑的书籍.全书共十卷,分七言.五言.六言三部分,其中七言七卷.五言两卷.六言一卷,且按帝王.后妃.宫掖.宗室.降王.宋臣.闺媛等分类,收录有王安石.苏轼.黄庭坚.秦观.陆游.杨万里.范成大等著名诗人的六言绝句. 编著者简介:严长明(1731—1787),清诗文家.字冬友,一字道甫,号东有,江宁(今南京)人.长明幼即显露奇慧.年十一岁,李绂典试江南,十分惊奇于这个童子的聪慧,特嘱咐从方苞学.不久,进扬州马曰琯.马曰璐兄弟的学馆,尽读其“小玲珑山庄”藏书.乾隆二十七年

POJ 3009-Curling 2.0(DFS)

Curling 2.0 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12158   Accepted: 5125 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

poj3009--Curling 2.0(搜索练习1)

Curling 2.0 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Appoint description:  System Crawler  (2013-02-19) Description On Planet MM-21, after their Olympic games this year, curling is getting popular. Bu

POJ3009:Curling 2.0(dfs)

http://poj.org/problem?id=3009 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. The