P1618. 模板题_三连击(升级版)

考点

  • 枚举
  • 排列组合

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <bits/stdc++.h>

using namespace std;

int arr[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

int num(int idx)
{
int sum = 0;
for (int i = 0; i < 3; ++i)
sum = sum * 10 + arr[idx + i];
return sum;
}

int main()
{
int a, b, c, flag = false;
cin >> a >> b >> c;
do
{
int num_1 = num(0), num_2 = num(3), num_3 = num(6);
if (num_1 * b == num_2 * a && num_1 * c == num_3 * a && num_2 * c == num_3 * b)
{
cout << num_1 << " " << num_2 << " " << num_3 << endl;
flag = true;
}
} while (next_permutation(arr, arr + 9));
if (!flag)
cout << "No!!!";
return 0;
}

思路

根据题意,三个数的数字均不可能重复

实际上就可以视作为数字1-9的全排列,每次按序取前三位,中三位和后三位组成的数进行比较

STL中有函数next_permutation专门实现这一操作