[NOIP1998 普及组] 三连击

题目背景

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

题目描述

【洛谷 P1008】[NOIP1998 普及组] 三连击 题解(枚举+位集合)_#include【洛谷 P1008】[NOIP1998 普及组] 三连击 题解(枚举+位集合)_ios_02 个数分成 【洛谷 P1008】[NOIP1998 普及组] 三连击 题解(枚举+位集合)_ios_03 组,分别组成 【洛谷 P1008】[NOIP1998 普及组] 三连击 题解(枚举+位集合)_ios_03 个三位数,且使这 【洛谷 P1008】[NOIP1998 普及组] 三连击 题解(枚举+位集合)_ios_03 个三位数构成 【洛谷 P1008】[NOIP1998 普及组] 三连击 题解(枚举+位集合)_#include_06 的比例,试求出所有满足条件的 【洛谷 P1008】[NOIP1998 普及组] 三连击 题解(枚举+位集合)_ios_03 个三位数。

输入格式

输出格式

若干行,每行 【洛谷 P1008】[NOIP1998 普及组] 三连击 题解(枚举+位集合)_ios_03 个数字。按照每行第 【洛谷 P1008】[NOIP1998 普及组] 三连击 题解(枚举+位集合)_#include_09 个数字升序排列。

样例 #1

样例输入 #1

样例输出 #1

192 384 576
* * *
...

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

思路

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


AC代码

#include <iostream>
#include <bitset>
#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;
}