洛谷P1618 三连击(升级版)题解

题目描述

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

输入输出格式

输入格式:

三个数,A B C。

输出格式:

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

输入输出样例

输入样例#1: 复制

1 2 3

输出样例#1: 复制

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

说明

保证A<B<C


这道题先遍历出前六位,然后按照比导推出后三位;

  1. 先判断1-3位与4-6位比例是否正确;
  2. 如果正确就把得到的九位数通过下面的estimate()函数判断是否有重复数字没有就返回true;
  3. 最后通过下面的pd()函数判断之前有没有输出过重复的9位数;

    如果以上三个条件成立,就打印结果,继续遍历新的前六位,到边界停止;

#include <iostream>

using namespace std;

int A, B, C, f[10] = {0},k = 0,d = 0,temp = 0,u = 0,ui[201];
bool estimate(int a,int b,int c) {
    for (int i = 1; i <= 3; i++) {
            if (i == 1) d = a;
            if (i == 2) d = b;
            if (i == 3) d = c;

        while (d)
        {
            if (!f[d % 10]) {
                f[d % 10] = true;
                d /= 10;
            }
            else {
                for (int s = 1; s <= 9; s++) f[s] = 0;
                return 0;
            }
        }
    }
    return 1;
}
bool pd(int i) {
    for (int j = 1; j <= u; j++) {
        if (ui[j] == i) return 0;
    }
    return 1;
}
int main() {
    cin >> A >> B >> C;
    for (int i = 123; i <= 350; i++) {
        for (int j = i; j <= 999; j++) {
            int z = (i + j)/(A+B)*C;
            if(i == j / B * A)
                if (estimate(i, j, z)&&pd(i)) {
                    u++;
                    ui[u] = i;
                    cout << i << ' ' << j << ' ' << z << endl;
                    temp++;
                }
        }
    }
    if (temp == 0) cout << "No!!!";
    system("pause");
    return 0;
}

 

posted @ 2018-10-21 01:16  LackProgramMonkey  阅读(371)  评论(0编辑  收藏  举报
返回顶部