《六月集训》第十七日——广度优先搜索

前言

这是六月集训的第十七日,今日的训练内容是 广度优先搜索

解题报告

1.力扣2059

原题链接

2059. 转化数字的最小运算数

题目概述

给你一个下标从 0 开始的整数数组 nums ,该数组由 互不相同 的数字组成。另给你两个整数 start 和 goal 。

整数 x 的值最开始设为 start ,你打算执行一些运算使 x 转化为 goal 。你可以对数字 x 重复执行下述运算:

如果 0 <= x <= 1000 ,那么,对于数组中的任一下标 i(0 <= i < nums.length),可以将 x 设为下述任一值:

x + nums[i]
x - nums[i]
x ^ nums[i](按位异或 XOR)
注意,你可以按任意顺序使用每个 nums[i] 任意次。使 x 越过 0 <= x <= 1000 范围的运算同样可以生效,但该该运算执行后将不能执行其他运算。

返回将 x = start 转化为 goal 的最小操作数;如果无法完成转化,则返回 -1 。

解题思路

这题的BFS是需要借助访问数组的,因为会出现死循环的情况。然后直接BFS就可以了(使用一个队列来辅助)。

源码剖析

#define MAX_NUM 10000
int minimumOperations(int* nums, int numsSize, int start, int goal){
    int *que = (int *)malloc(sizeof(int) * MAX_NUM);        //定义一个队列用于BFS
    int *visit = (int *)malloc(sizeof(int) * MAX_NUM);      //这题有可能会出现死循环,所以需要标记一下访问过的结点
    memset(visit, 0, sizeof(int) * MAX_NUM);
    int l = 0;
    int r = 0;
    que[r++] = start;
    visit[start] = 1;
    int level = 0;
    while (l < r) {
        level++;
        int len = r - l;
        while (len--) {
            int cur = que[l++];
            for (int i = 0; i < numsSize; i++) {
                int sum = cur + nums[i];
                int minus = cur - nums[i];
                int odd = cur ^ nums[i];
                if (sum == goal || minus == goal || odd == goal) return level;
                if (sum >= 0 && sum <= 1000 && visit[sum] != 1) {
                    que[r++] = sum;
                    visit[sum] = 1;
                }
                if (minus >= 0 && minus <= 1000 && visit[minus] != 1) {
                    que[r++] = minus;
                    visit[minus] = 1;
                }
                if (odd >= 0 && odd <= 1000 && visit[odd] != 1) {
                    que[r++] = odd;
                    visit[odd] = 1;
                }
            }
        }
    }
    return -1;
}

2.力扣690

原题链接

690. 员工的重要性

题目概述

这题只可以用c++写,不可以用c写,所以就只能先记录一下了。

3.力扣672

原题链接

672. 灯泡开关 Ⅱ

题目概述

现有一个房间,墙上挂有 n 只已经打开的灯泡和 4 个按钮。在进行了 m 次未知操作后,你需要返回这 n 只灯泡可能有多少种不同的状态。

假设这 n 只灯泡被编号为 [1, 2, 3 …, n],这 4 个按钮的功能如下:

将所有灯泡的状态反转(即开变为关,关变为开)
将编号为偶数的灯泡的状态反转
将编号为奇数的灯泡的状态反转
将编号为 3k+1 的灯泡的状态反转(k = 0, 1, 2, …)

解题思路

没太想明白怎么用BFS来实现,先做记录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值