一道超难的c语言迷宫问题

JudgeInfoMemoryLimit:65536KBCaseTimeLimit:1000MSTimeLimit:1000MSJudger:NormalDescript... Judge Info
Memory Limit: 65536KB
Case Time Limit: 1000MS
Time Limit: 1000MS
Judger: Normal
Description
主人公仙石晃与同学们一起参加学校毕业旅行,但在回程的途中遭遇空难。主人公和同伴们被迫滞留在一个未知的小岛、蛮荒世界里。主人公和同伴们抱着种种疑问在这个弱肉强食、危机四伏的世界里挣扎求存。 为了简化问题,可以将整个小岛看成一个N * M的方格矩阵,每个方格里有一个整数,正数时表示主人公带领同伴离开该方格地型所需花费的时间(忽略进入方格所需时间),负数时表示该方格地型是障碍物,不可进入。很不幸,在其中一些方格里徘徊着一些凶猛上古猛兽,猛兽都拥有敏锐的臭觉,每个猛兽都有一个搜寻猎物能力值bi, 当有猎物出现其所在的方格地型里,猛兽就会穷追不舍,直到发现猎物,并瞬间吞杀所有猎物。初始时主人公与同伴在方格(1,1)里,只能往上下左右四个方向移动,如果途中移动到有猛兽的格子里,则会被这个猛兽追踪,在以后移动到的每个格子(包括该猛兽初始所在格子)里停留的时间不能超过K-sumB, K为一个整数常量,sumB为当前追踪主人公团队的所有猛兽的能力值总和。在方格(N,M)里有个安全的避难所,主人公要在最短的时间内带领同伴们安全抵达避难所,进入安全区域后不会受到攻击,并且避难所所在方格保证不为障碍物。
Input
输入只有一组数据。 第一行输入两个整数N,M (0 < N, M < 100)。 接下来N行,每行有M个以空格分开的整数,每个整数的绝对值不超过1000。 接下来一行输入两个整数L, K(0 <= L <= 5, 0 <= K <= 1000),L表示该小岛上猛兽的个数,K为题意所示的整数常量。 接下来L行,每行三个整数xi,yi,bi, (1<=xi<=N, 1<=yi<=M, 0<=bi<=1000),(xi, yi)表示第i个猛兽初始时所在的方格为第xi行、yi列,bi表示第i个猛兽的搜寻猎物能力值。初始时保证同一个方格不会出现多于一个猛兽,并且猛兽在没有发现猎物之前会一直停留在这个方格里。
Output
如果主人公仙石晃能安全抵达避难所,输出其到达避难所所用的最短时间。 否则,输出一行"Oh~,poor boys and girls!",不包括双引号。
Sample Input
4 4
7 9 8 1
5 7 7 10
8 -10 -7 5
10 4 4 3
2 8
2 1 2
3 4 1
Sample Output
40
展开
 我来答
冰火梦幻
2014-02-15 · TA获得超过2307个赞
知道小有建树答主
回答量:1094
采纳率:57%
帮助的人:545万
展开全部

没觉得多难……三维数组的BFS而已。

话说出题人是《逃离伊甸园》看多了吗?

PS:请题主提供题目的链接。

//
//   File name      : Main.cpp
//
//   Code by        : jiangyonghang
//
//   Project name   : EscapeFromEden
//
//   Create datetime: 2014-02-15 09:06:28
//

// Tested or implemented header
// ...

// C system headers
#include <stdio.h>
#include <memory.h>

// C++ system headers
// ...

// Headers from other projects
// ...

// Headers of current project
// ...

#define MAX_MAP_LINE (100)
#define MAX_MAP_COLUMN (100)
#define MAX_LEAVE_GRID_TIME (1000)
#define MAX_TIME (MAX_LEAVE_GRID_TIME * MAX_MAP_LINE * MAX_MAP_COLUMN + 1)

#define MAX_BEAST_COUNT (5)
#define MAX_BEAST_MEET_STATE (1 << MAX_BEAST_COUNT)
#define MAX_ONE_BEAST_ABILITY (1000)
#define MAX_TOTAL_BEAST_ABILITY (MAX_ONE_BEAST_ABILITY * MAX_BEAST_COUNT + 1)

typedef struct
{
    int leave_time;
    int beast_meet_state; // bit: 00000~11111 for 5 beasts
}GRID;

typedef struct
{
    int line;
    int column;
    unsigned int beast_meet_state; // bit: 00000~11111 for 5 beasts
}EXPAND_GRID;

typedef struct
{
    EXPAND_GRID grid_list[MAX_MAP_LINE * MAX_MAP_COLUMN];
    int grid_count;
}EXPAND_GRID_LIST;

GRID g_map[MAX_MAP_LINE][MAX_MAP_COLUMN];

// g_answer[i][j][k]:
// The time which had been cost when you entered the grid (i, j) [without leave time of this grid]
// with the beast state k [including the beast in (i, j)].
int g_answer[MAX_MAP_LINE][MAX_MAP_COLUMN][MAX_BEAST_MEET_STATE]; 

int g_beast_ability_sum[MAX_BEAST_MEET_STATE];
int g_map_width;
int g_map_height;
int g_K = 0;

void InputMap();
void InputBeast();
void Search();

int main()
{
    int i = 0;
    int answer = 0;

    InputMap();
    InputBeast();
    Search();

    answer = MAX_TIME;
    for (i = 0; i < MAX_BEAST_MEET_STATE; i++)
    {
        if (g_answer[g_map_height - 1][g_map_width - 1][i] < answer)
        {
            answer = g_answer[g_map_height - 1][g_map_width - 1][i];
        }
    }
    if (answer < MAX_TIME)
    {
        printf("%d\n", answer);
    }
    else
    {
        printf("Oh~,poor boys and girls!\n");
    }

    return 0;
}

void InputMap()
{
    int i = 0;
    int j = 0;
    int k = 0;
    scanf("%d%d", &g_map_height, &g_map_width);
    for (i = 0; i < g_map_height; i++)
    {
        for (j = 0; j < g_map_width; j++)
        {
            scanf("%d", &g_map[i][j].leave_time);
            g_map[i][j].beast_meet_state = 0;

            for (int k = 0; k < MAX_BEAST_MEET_STATE; k++)
            {
                g_answer[i][j][k] = MAX_TIME;
            }
        }
    }
    return;
}

void InputBeast()
{
    int i = 0;
    int j = 0;
    int line = 0;
    int column = 0;
    int beast_number = 0;
    int beast_ability[MAX_BEAST_COUNT];

    scanf("%d%d", &beast_number, &g_K);
    for (i = 0; i < beast_number; i++)
    {
        scanf("%d%d", &line, &column);
        g_map[line - 1][column - 1].beast_meet_state = (1 << i);
        scanf("%d", &beast_ability[i]);
    }

    for (i = 0; i < MAX_BEAST_MEET_STATE; i++)
    {
        g_beast_ability_sum[i] = 0;
        for (j = 0; j < beast_number; j++)
        {
            if (i & (1 << j) )
            {
                g_beast_ability_sum[i] += beast_ability[j];
            }
        }
    }
    return;
}

void AppendToGridList(EXPAND_GRID_LIST *grid_list, int new_grid_line, int new_grid_column, unsigned int new_beast_meet_state)
{
    grid_list->grid_list[grid_list->grid_count].line             = new_grid_line;
    grid_list->grid_list[grid_list->grid_count].column           = new_grid_column;
    grid_list->grid_list[grid_list->grid_count].beast_meet_state = new_beast_meet_state;
/*
    printf(
        "Expending: [%3d][%3d][%3d] = %6d\n",
        new_grid_line,
        new_grid_column,
        new_beast_meet_state,
        g_answer[new_grid_line][new_grid_column][new_beast_meet_state]
    );*/
    grid_list->grid_count++;
    return;
}

int IsDestination(int line, int column)
{
    if ( 
        (g_map_height == line) &&
        (g_map_width == column)
    )
    {
        return true;
    }
    return false;
}

int IsEnterable(int line, int column)
{
    if (line < 0)
    {
        return false;
    }

    if (line >= g_map_height)
    {
        return false;
    }

    if (column < 0)
    {
        return false;
    }

    if (column > g_map_width)
    {
        return false;
    }

    if (g_map[line][column].leave_time < 0)
    {
        return false;
    }

    return true;
}

int Expandable(int line, int column, int now_time, unsigned int now_beast_state)
{
    int          new_time = now_time + g_map[line][column].leave_time;
    unsigned int new_beast_state = 0;

    if (!IsEnterable(line, column) )
    {
        return false;
    }

    if (IsDestination(line, column) )
    {
        return true;
    }

    if (now_beast_state & g_map[line][column].beast_meet_state) // have met the beast in this grid
    {
        return false;
    }

    new_beast_state = (now_beast_state | g_map[line][column].beast_meet_state);

    if (
        (new_beast_state > 0) &&
        (g_map[line][column].leave_time > g_K - g_beast_ability_sum[new_beast_state] )
    )// too strong beasts
    {
        return false;
    }

    if (now_time >= g_answer[line][column][new_beast_state]) // TODO: some branch could be cut here: less time cost and less beast ability.
    {
        return false;
    }

    return true;
}

void CopyGridList(EXPAND_GRID_LIST *dest, EXPAND_GRID_LIST *src)
{
    dest->grid_count = src->grid_count;
    memcpy(dest->grid_list, src->grid_list, src->grid_count * sizeof(src->grid_list[0]) );
    return;
}

void Search()
{
    EXPAND_GRID_LIST now_list;
    EXPAND_GRID_LIST next_list;

    int i = 0;
    int j = 0;

    int          now_cost_time        = 0;
    unsigned int now_beast_meet_state = 0;

    int          new_grid_line        = 0;
    int          new_grid_column      = 0;
    int          new_cost_time        = 0;
    unsigned int new_beast_meet_state = 0;

    int direction_list[4][2] = {
        {-1,  0},
        { 1,  0},
        { 0, -1},
        { 0,  1}
    };

    now_list.grid_count = 0;
    next_list.grid_count = 0;

    for (i = 0; i < MAX_BEAST_MEET_STATE; i++)
    {
        g_answer[0][0][i] = 0;
    }
    AppendToGridList(&now_list, 0, 0, g_map[0][0].beast_meet_state);

    while (now_list.grid_count > 0)
    {
        next_list.grid_count = 0;
        for (int i = 0; i < now_list.grid_count; i++)
        {
            now_cost_time        = g_answer[now_list.grid_list[i].line][now_list.grid_list[i].column][now_list.grid_list[i].beast_meet_state];
            new_cost_time        = now_cost_time + g_map[now_list.grid_list[i].line][now_list.grid_list[i].column].leave_time;
            now_beast_meet_state = now_list.grid_list[i].beast_meet_state;
            for (j = 0; j < 4; j++)
            {
                new_grid_line        = now_list.grid_list[i].line   + direction_list[j][0];
                new_grid_column      = now_list.grid_list[i].column + direction_list[j][1];
                new_beast_meet_state = now_beast_meet_state | g_map[new_grid_line][new_grid_column].beast_meet_state;
                if (Expandable(new_grid_line, new_grid_column, now_cost_time, now_beast_meet_state) )
                {
                    g_answer[new_grid_line][new_grid_column][new_beast_meet_state] = new_cost_time;
                    AppendToGridList(&next_list, new_grid_line, new_grid_column, new_beast_meet_state);
                }
            }
        }

        CopyGridList(&now_list, &next_list);
    }

    return;
}
更多追问追答
追问
你好,可以先告诉我bfs算法怎么解决野兽追踪的问题吗
你好,可以先告诉我bfs算法怎么解决野兽追踪的问题吗
Rankabc
2014-02-15 · TA获得超过3558个赞
知道大有可为答主
回答量:3705
采纳率:59%
帮助的人:999万
展开全部
果然很难,题意都不懂
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式