P1618 三连击(升级版)

题目描述

将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试求出所有满足条件的三个三位数,若无解,输出“No!!!”。
//感谢黄小U饮品完善题意

输入输出格式

输入格式:

三个数,A B C。

输出格式:

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

输入输出样例

输入样例#1:

1 2 3

输出样例#1:

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

说明

保证A<B<C


//P1618 三连击(升级版)
// 打表就行啦
#include <iostream>
#include <vector>

using namespace std;
double num[1024];
int count = 0;
void prev() {
	for (int i = 1; i < 10; i++) {
		for (int j = 1; j < 10; j++) {
			for (int k = 1; k < 10; k++) {
				if (i != j && i != k && j != k) {
					num[::count++] = i * 100.0 + j * 10 + k;
				}
			}
		}

	}
}

// 找相同数字的好思路
bool check(int a, int b, int c) {
	int temp[10] = {false};
	while (a) {
		temp[a % 10] = true;
		a /= 10;

		temp[b % 10] = true;
		b /= 10;

		temp[c % 10] = true;
		c /= 10;
	}
	for (int i = 1; i < 10; i++) {
		if (temp[i] == false)
			return false;
	}
	return true;
}

void swap(int &num1, int& num2) {
	int t;
	t = num1; num1 = num2; num2 = t;
}
typedef struct stg_def {
	int num1;
	int num2;
	int num3;
	bool isHave;
	stg_def() :num1(-1),num2(-1),num3(-1),isHave(false){}
	void sort() {
		if (num1 > num2)
			swap(num1, num2);
		if (num1 > num3)
			swap(num1, num3);
		if (num2 > num3) {
			swap(num2, num3);
		}
	}
} stg;

int main() {
	vector<stg> vec;
	prev();
	double a, b, c;
	bool isHave = false;
	cin >> a >> b >> c;
	
	for (int i = 0; i < ::count; i++) {
		for (int j = 0; j < ::count; j++) {
			if (i == j) continue;
			//  y * a          b * x
			if (::num[j] * a == b*::num[i]) {
				stg temp;
				temp.num1 = num[i];  // x
				temp.num2 = num[j];  // y
				vec.push_back(temp);
			}
		}
	}

	for (auto it = vec.begin(); it != vec.end(); it++) {
		for (int i = 0; i < ::count; i++) {
			if (b*::num[i] == c*it->num2 && a*::num[i] == c*it->num1) {
				it->isHave = true;
				it->num3 = num[i];
				break;
			}
		}
	}

	for (auto it = vec.begin(); it != vec.end(); it++) {
		if (it->isHave == true && check(it->num1, it->num2,it->num3)) {
			it->sort();
			isHave = true;
			cout << it->num1 << " " << it->num2 << " " << it->num3 << endl;
		}
	}
	if (isHave == false) {
		cout << "No!!!" << endl;
	}
	return 0;
}
原文地址:https://www.cnblogs.com/laohaozi/p/12537724.html