【洛谷 P1618】三连击(升级版)题解(深度优先搜索+位集合)

简介: `三连击(升级版)` 是一道编程题,要求将数字 19 分成三组,构成三个三位数,其比例为 A:B:C。给定 A, B, C,程序应找到所有可能的组合并按首位升序输出。输入为 A, B, C,输出是满足比例的三位数或"No!!!"(当无解时)。解决方案涉及全排列搜索和比例验证。提供的AC代码使用C++,通过位集记录数字使用情况,递归实现全排列。

三连击(升级版)

题目描述

1,2,,99 个数分成三组,分别组成三个三位数,且使这三个三位数的比例是 A:B:C,试求出所有满足条件的三个三位数,若无解,输出 No!!!

//感谢黄小U饮品完善题意

输入格式

三个数,A,B,C

输出格式

若干行,每行 3 个数字。按照每行第一个数字升序排列。

样例 #1

样例输入 #1

1 2 3
AI 代码解读

样例输出 #1

192 384 576
219 438 657
273 546 819
327 654 981
AI 代码解读

提示

保证 A<B<C


upd 2022.8.3:新增加二组 Hack 数据。

思路

搜索得到全排列,用乘法判断是否符合比例关系。

AC代码

#include <iostream>
#include <bitset>
#include <cmath>
#define AUTHOR "HEX9CF"
using namespace std;

int a, b, c;
int x, y, z;
bitset<15> bs;
int arr[15];
int flg;

void f()
{
   
    if (9 == bs.count())
    {
   
        a = 0;
        b = 0;
        c = 0;
        for (int i = 0; i < 3; i++)
        {
   
            a += arr[i + 1] * pow(10, 2 - i);
            b += arr[i + 4] * pow(10, 2 - i);
            c += arr[i + 7] * pow(10, 2 - i);
        }
        if ((a * y == b * x) && (a * z == c * x) && (b * z == c * y))
        {
   
            cout << a << " " << b << " " << c << endl;
            flg = 1;
        }
        return;
    }
    for (int i = 1; i <= 9; i++)
    {
   
        if (!bs[i])
        {
   
            bs[i] = 1;
            arr[bs.count()] = i;
            f();
            bs[i] = 0;
        }
    }
}

int main()
{
   
    bs.reset();
    cin >> x >> y >> z;
    f();
    if(!flg){
   
        cout << "No!!!" << endl;
    }
    return 0;
}
AI 代码解读
HEX9CF
+关注
目录
打赏
0
0
0
0
1
分享
相关文章
【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题
【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题
110 0
|
9月前
【洛谷 P1618】三连击(升级版)题解(循环枚举+全排列)
该编程题目要求将数字1到9分为三组,形成三个三位数,使得这三个数成比例A:B:C。输入为A、B、C的值,输出符合条件的三位数组合,按首个数字升序排列。样例输入为1 2 3,输出多组解。代码使用全排列遍历数字,检查比例关系。若无解,则输出&quot;No!!!&quot;。
106 0
【洛谷 P1803】凌乱的yyy _ 线段覆盖 题解(贪心算法+结构体排序)
**线段覆盖问题**: YYY 想在 NOIP 前参加最多比赛。给定 n 场比赛的开始和结束时间,每场比赛必须连续且不能冲突。输入包含每场比赛的时间段,输出最多可参加的比赛数。20% 数据 n1050% 数据 n103100% 数据 n106。解决方案:按结束时间排序比赛,若当前比赛开始时间晚于上一个结束时间,则计数加一。样例输入:3 场比赛,输出:2。AC C++ 代码实现了此算法。
66 0
|
9月前
【洛谷 P1443】马的遍历 题解(广度优先搜索)
该问题是一个棋盘上的马的最短路径问题。给定一个n×m的棋盘和起点(x,y),需要计算马到达棋盘上每个位置的最短步数。输入包含n,m,x,y,输出是一个矩阵,表示各位置的步数或未可达的1。使用广度优先搜索(BFS)策略,从起点开始遍历,直到访问完所有可达位置。代码中定义了太阳数组表示马的移动方向,并通过队列实现BFS。最后输出格式要求每个数字左对齐且域宽为5。
67 0
【每日一题】牛客网——链表分割
【每日一题】牛客网——链表分割
|
10月前
|
代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结
代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结
73 1
代码随想录算法训练营第六天 | LeetCode 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和
代码随想录算法训练营第六天 | LeetCode 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和
90 0
代码随想录算法训练营第六天 | LeetCode 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和
代码随想录Day28 贪心03 LeetCode T1005 K次取反后最大化的数组和 LeetCode T134 加油站 LeetCode T135 分发糖果
代码随想录Day28 贪心03 LeetCode T1005 K次取反后最大化的数组和 LeetCode T134 加油站 LeetCode T135 分发糖果
43 0
力扣每日一题:374.猜数字大小 python二分查找的基础公式!
力扣每日一题:374.猜数字大小 python二分查找的基础公式!
253 0
代码随想录算法训练营第六天| 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和
代码随想录算法训练营第六天| 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等