美文网首页
POJ-3009 Curling2.0

POJ-3009 Curling2.0

作者: JeremyChan | 来源:发表于2017-03-15 14:20 被阅读56次

POJ-3009 Curling2.0

Q: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.

解法参照

#include <iostream>
#include <stdlib.h>
#include <algorithm>
#define  MAX_NUM 21
using namespace std;

int H, W;
int dire[4][2] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} };   //定义四个方向
int minNum = INT_MAX;

void DFS(int map[][MAX_NUM], int x, int y, int step) {     //深搜
    if (step >= 10)                                        //超过10次直接退出
    {
        return;
    }
    for (int i = 0; i < 4; i++)                            //四个方向进行深搜
    {
        int k = x + dire[i][0]; 
        int v = y + dire[i][1];
        if (map[k][v] == 1)                                //如果该方向第一个就是障碍物,下个方向
        {
            continue;
        }
        while (!map[k][v])                                 //找到停止的位置
        {
            k += dire[i][0];
            v += dire[i][1];
        }
        if (k >= 0 && k < H && v >=0 && v < W)             //判断是否越界
        {
            if (map[k][v] == 1)                            //如果是障碍物,则破碎,继续深搜
            {
                map[k][v] = 0;
                DFS(map, k - dire[i][0], v - dire[i][1], step + 1);
                map[k][v] = 1;                             //回溯要复原原来的场景
            }

            if (map[k][v] == 3)
            {
                minNum = step + 1 < minNum ? step + 1 : minNum;
            }
        }
        
    }
}

int main()
{
    int sx, sy, map[MAX_NUM][MAX_NUM];
    while (cin >> W >> H&& W && H)
    {
        for (int i = 0; i < H; i ++)
        {
            for (int j = 0; j < W; j++)
            {
                cin >> map[i][j];
                if (map[i][j] == 2)
                {
                    map[i][j] = 0;
                    sx = i;
                    sy = j;
                }
            }
        }
        minNum = INT_MAX;
        DFS(map, sx, sy, 0);
        if (minNum < INT_MAX)
        {
            cout << minNum << endl;
        }
        else
        {
            cout << -1 << endl;
        }
    }
    return 0;
}

相关文章

网友评论

      本文标题:POJ-3009 Curling2.0

      本文链接:https://www.haomeiwen.com/subject/dcvlnttx.html