蓝桥杯之全排列函数next_permutation()运用

在蓝桥杯的题目中大多数都可以运用到全排列函数
充分运用可以节省很多的时间。话不多说来刷题


三羊献瑞
观察下面的加法算式:
祥 瑞 生 辉

+ 三 羊 献 瑞

三 羊 生 瑞 气
(如果有对齐问题,可以参看【图1.jpg】)其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。

看到这题一看就知道用暴力搜索法,代码如下

#include<iostream>
using namespace std;
int check(int num[],int n)
{
    for(int i = 0; i < n; i++)
    {
        if(num[i]==num[n])
        {
            return 0;
        }
    }
    return 1;
}
int main()
{
    int num[8];
    int count = 0;
    for(num[0] = 1; num[0] <=9; num[0]++)
    {
        if(check(num,0))
        for(num[1] = 0; num[1] <=9; num[1]++)
        {   if(check(num,1))
            for(num[2] = 0; num[2] <=9; num[2]++)
            {   if(check(num,2))
                for(num[3] = 0; num[3] <=9; num[3]++)
                {   if(check(num,3))
                    for(num[4] = 1; num[4] <=9; num[4]++)
                    {   if(check(num,4))
                        for(num[5] = 0; num[5] <=9; num[5]++)
                        {   if(check(num,5))
                            for(num[6] = 0; num[6] <=9; num[6]++)
                            {   if(check(num,6))
                                for(num[7] = 0; num[7] <=9; num[7]++)
                                {
                                    if(check(num,7))
                                    {
                                        int a = num[0]*1000+num[1]*100+num[2]*10+num[3];
                                        int b = num[4]*1000+num[5]*100+num[6]*10+num[1];
                                        int c = num[4]*10000+num[5]*1000+num[2]*100+num[1]*10+num[7];
                                        if(a+b==c)
                                        {
                                        cout << b;
                                        }   
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
}
    return 0;
}

看了一下六十多行,啊,学这么多好累啊!
对于这种超过5个循环以上的暴力可以考虑用全排列函数
第二种方法如下:

#include<iostream>
#include<algorithm>
using namespace std;
int main1()
{
    int num[10] = {1,0,2,3,4,5,6,7,8,9};
    int count = 0;
    do
    {
        if(num[0]!=0&&num[4]!=0)
        {
            int a = num[0]*1000+num[1]*100+num[2]*10+num[3];
            int b = num[4]*1000+num[5]*100+num[6]*10+num[1];
            int c = num[4]*10000+num[5]*1000+num[2]*100+num[1]*10+num[7];
            if(a+b==c)
            {
                cout << b;
                break;
            }
        }
    }while(next_permutation(num,num+10));
    return 0;
}

这就简便多了,这里注意到题目 答案唯一 所以当瞒住条件后就可以跳出循环,算法的时间就可以大大减少
自己总结了一下运用全排列的环境

  1. 五重循环以上
  2. 数字不能重复
  3. 要有顺序
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值