C语言网 - 题目 1518: [蓝桥杯][算法提高VIP]寻找三位数(巧妙使用next_permutation)

题目

题目链接

参考代码

#include<bits/stdc++.h>

using namespace std;

int ia[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int a, b, c;
int main(void) {
    do {
        a = ia[2] + ia[1] * 10 + ia[0] * 100;
        b = ia[5] + ia[4] * 10 + ia[3] * 100;
        c = ia[8] + ia[7] * 10 + ia[6] * 100;
        if (b == 2 * a && c == 3 * a)
            cout << a << ' ' << b << ' ' << c << endl;
    } while (next_permutation(ia, ia + 9));

    return 0;
}

解题思路

刚看题目可能会想到dfs,但是这样会比较麻烦,不易想
所以由于此题中9个数字不会重复使用,并且数据量不大,那么我们可以试一试全排列,也就是算法库中的next_permutation()函数
代码很易看懂,这里不多赘述

注意事项

这个题比较坑的地方是没有说每不同组解按什么顺序输出,因为这个我WA了好几次找不到原因
正确的顺序是从小到大排列,也就是按照每组解的第一个数从从小到大的顺序排列,这也就要求我们在循环的时候要先将排列在前的数作为百位上的数来计算
举个例子

//应该是
a = ia[2] + ia[1] * 10 + ia[0] * 100;
//而不是
a = ia[0] + ia[1] * 10 + ia[1] * 100;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值