【leetcode_675】【困难】cut-off-trees-for-golf-event / 为高尔夫比赛砍树

URL

链接:https://leetcode.cn/problems/cut-off-trees-for-golf-event/


题目

截图
在这里插入图片描述
在这里插入图片描述


分析

截图
在这里插入图片描述


源码

工程结构

.
└── main_675.c

源码文件

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

//#define DEBUG

typedef struct
{
    int x;
    int y;
    int height;
} TREE;

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

static int cmp(const void *pa, const void *pd)
{
    return ((TREE *)pa)->height - ((TREE *)pd)->height;
}

int bfs(int **forest, int row, int col, int sx, int sy, int tx, int ty)
{
    if (sx == tx && sy == ty)
    {
        return 0;
    }
    int step = 0;
    int *queue = (int *)malloc(sizeof(int) * row * col);
    int *visited = (int *)malloc(sizeof(int) * row * col);
    int head = 0, tail = 0;
    memset(visited, 0, sizeof(int) * row * col);
    queue[tail++] = sx * col + sy;
    visited[sx * col + sy] = true;
    while (head != tail)
    {
        step++;
        int sz = tail - head;
        for (int i = 0; i < sz; ++i)
        {
            int cx = queue[head] / col;
            int cy = queue[head] % col;
            head++;
            for (int j = 0; j < 4; ++j)
            {
                int nx = cx + dirs[j][0];
                int ny = cy + dirs[j][1];
                if (nx >= 0 && nx < row && ny >= 0 && ny < col)
                { // !!! >=
                    if (!visited[nx * col + ny] && forest[nx][ny] > 0)
                    {
                        if (nx == tx && ny == ty)
                        {
                            free(queue);
                            free(visited);
                            return step;
                        }
                        queue[tail++] = nx * col + ny;
                        visited[nx * col + ny] = true;
                    }
                }
            }
        }
    }

    free(queue);
    free(visited);
    return -1;
}

int cut_off_tree(int **forest, int forest_size, int *forest_colsize)
{
    int row = forest_size;
    int col = forest_colsize[0];

    int tree_size = 0;
    for (int i = 0; i < row; ++i)
    {
        // FIXME
        if (col == 3)
        {
            printf("input: forest[%d] = {%d,%d,%d}\n", i, forest[i][0], forest[i][1], forest[i][2]);
        }
        for (int j = 0; j < col; ++j)
        {
            if (forest[i][j] > 1)
            {
                tree_size++;
            }
        }
    }
#ifdef DEBUG
    printf("DEBUG: row = %d, col = %d\n", row, col);
    printf("DEBUG: tree_size = %d\n", tree_size);
#endif

    TREE *trees = (TREE *)malloc(sizeof(TREE) * tree_size);
    int pos = 0;
    for (int i = 0; i < row; ++i)
    {
        for (int j = 0; j < col; ++j)
        {
            if (forest[i][j] > 1)
            {
                trees[pos].x = i;
                trees[pos].y = j;
                trees[pos].height = forest[i][j];
                pos++;
            }
        }
    }
#ifdef DEBUG
    for (int i = 0; i < tree_size; ++i)
    {
        printf("DEBUG: tree[%d] = (%d,%d) %d\n", i, trees[i].x, trees[i].y, trees[i].height);
    }
#endif

    qsort(trees, tree_size, sizeof(TREE), cmp);
#ifdef DEBUG
    printf("DEBUG: after qsort\n");
    for (int i = 0; i < tree_size; ++i)
    {
        printf("DEBUG: tree[%d] = (%d,%d) %d\n", i, trees[i].x, trees[i].y, trees[i].height);
    }
#endif
    int cx = 0;
    int cy = 0;
    int ans = 0;
    for (int i = 0; i < tree_size; ++i)
    {
        int steps = bfs(forest, row, col, cx, cy, trees[i].x, trees[i].y);
        if (steps == -1)
        {
            printf("peace and love\n");
            return -1;
        }
        ans += steps;
        cx = trees[i].x;
        cy = trees[i].y;
    }
    return ans;
}

#define ROW (3)
#define COL (3)
int main()
{
    int col = COL;

    // int data[][COL] = {{1,2,3},{0,0,4},{7,6,5}}; // ret step = 6
    // int data[][COL] = {{1,2,3},{0,0,0},{7,6,5}}; // ret step = -1
    int data[][COL] = {{2, 3, 4}, {0, 0, 5}, {8, 7, 6}}; // ret step = 6

    int **forest = (int **)malloc(sizeof(int *) * ROW);
    for (int i = 0; i < ROW; ++i)
    {
        forest[i] = (int *)malloc(sizeof(int) * COL);
    }
    for (int i = 0; i < ROW; ++i)
    {
        for (int j = 0; j < COL; ++j)
        {
            forest[i][j] = data[i][j];
        }
    }

    int size = sizeof(data) / sizeof(data[0]);
    int steps = cut_off_tree(forest, size, &col);
    printf("Step(s) = %d\n", steps);

    for (int i = 0; i < ROW; ++i)
    {
        free(forest[i]);
    }
    free(forest);

    return 0;
}

LOG参考

input: forest[0] = {1,2,3}
input: forest[1] = {0,0,4}
input: forest[2] = {7,6,5}
Step(s) = 6

input: forest[0] = {1,2,3}
input: forest[1] = {0,0,0}
input: forest[2] = {7,6,5}
peace and love
Step(s) = -1

input: forest[0] = {2,3,4}
input: forest[1] = {0,0,5}
input: forest[2] = {8,7,6}
Step(s) = 6


源码概述

  1. 见源码

小结

peace and love

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

过得精彩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值