【洛谷 P1008】[NOIP1998 普及组] 三连击 题解(枚举+位集合)

[NOIP1998 普及组] 三连击

题目背景

本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。

题目描述

1 , 2 , … , 9 1, 2, \ldots , 9 1,2,,9 9 9 9 个数分成 3 3 3 组,分别组成 3 3 3 个三位数,且使这 3 3 3 个三位数构成 1 : 2 : 3 1 : 2 : 3 1:2:3 的比例,试求出所有满足条件的 3 3 3 个三位数。

输入格式

输出格式

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

样例 #1

样例输入 #1

样例输出 #1

192 384 576
* * *
...

* * *
(剩余部分不予展示)

思路

枚举所有可能的三位数,判断这三个数是否由1到9这9个数字组成,每个数字仅出现一次。
注意:这9个数字是1到9,不含0。


AC代码

#include 
#include 
#define AUTHOR "HEX9CF"
using namespace std;

bitset<10> bs;

void set(int x)
{
    bs.set(x % 10);
    bs.set((x % 100 - x % 10) / 10);
    bs.set((x % 1000 - x % 100) / 100);
}

int main()
{
    for (int i = 111; i < 1000 && i <= 1000 / 3; i++)
    {
        bs.reset();
        int j = i * 2;
        int k = i * 3;
        set(i);
        set(j);
        set(k);
        if (9 == bs.count() && 0 == bs[0])
        {
            cout << i << " " << j << " " << k << endl;
        }
    }
    return 0;
}

你可能感兴趣的:(数据结构与算法,算法,c++,开发语言)