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

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

三连击(升级版)

题目描述

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

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

输入格式

三个数,$A,B,C$。

输出格式

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

样例 #1

样例输入 #1

1 2 3

样例输出 #1

192 384 576
219 438 657
273 546 819
327 654 981

提示

保证 $A<B<C$。


$\text{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;
}
目录
相关文章
|
算法
单链表(算法面试题2)---单链表进阶2 一题多解,逐步优化
单链表(算法面试题2)---单链表进阶2 一题多解,逐步优化
44 0
|
2月前
|
存储
Leetcode第十五题(三数之和)
LeetCode第十五题“三数之和”要求在一个整数数组中找出所有不重复的三元组,使得它们的和为0,通常通过先排序再使用双指针法来解决。
41 0
Leetcode第十五题(三数之和)
|
6月前
|
存储
力扣每日一题 6/19 排序+动态规划
力扣每日一题 6/19 排序+动态规划
35 0
|
6月前
【洛谷 P1618】三连击(升级版)题解(循环枚举+全排列)
该编程题目要求将数字1到9分为三组,形成三个三位数,使得这三个数成比例A:B:C。输入为A、B、C的值,输出符合条件的三位数组合,按首个数字升序排列。样例输入为1 2 3,输出多组解。代码使用全排列遍历数字,检查比例关系。若无解,则输出&quot;No!!!&quot;。
69 0
|
6月前
|
人工智能 算法 搜索推荐
蓝桥杯宝藏排序题目算法(冒泡、选择、插入)
以下是内容的摘要: 本文介绍了三种排序算法:冒泡排序、选择排序和插入排序。冒泡排序通过不断交换相邻的逆序元素逐步排序,最坏情况下需要 O(n^2) 次比较。选择排序在每轮中找到剩余部分的最小元素并放到已排序序列的末尾,同样具有 O(n^2) 时间复杂度。插入排序则是将每个元素插入到已排序序列的正确位置,时间复杂度也是 O(n^2),但空间复杂度为 O(1)。
|
6月前
|
算法
【经典LeetCode算法题目专栏分类】【第9期】深度优先搜索DFS与并查集:括号生成、岛屿问题、扫雷游戏
【经典LeetCode算法题目专栏分类】【第9期】深度优先搜索DFS与并查集:括号生成、岛屿问题、扫雷游戏
|
算法
第四天_双指针【算法入门】
第四天_双指针【算法入门】
42 0
|
7月前
|
算法
六六力扣刷题双指针之移除元素
六六力扣刷题双指针之移除元素
59 0
|
7月前
|
算法
六六力扣刷题二叉树之迭代遍历
六六力扣刷题二叉树之迭代遍历
56 0
|
7月前
|
机器学习/深度学习 算法
六六力扣刷题双指针之三数之和
六六力扣刷题双指针之三数之和
62 0