扑克序列 蓝桥杯

本文介绍了一个有趣的编程挑战——扑克序列问题,目标是找出特定排列的字典序最小解。使用了暴力搜索算法,通过八重循环遍历所有可能的排列组合,并检查是否符合题目要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标题:扑克序列

    A A 2 2 3 3 4 4, 一共4对扑克牌。请你把它们排成一行。
    要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。

    请填写出所有符合要求的排列中,字典序最小的那个。

例如:22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。


请通过浏览器提交答案。“A”一定不要用小写字母a,也不要用“1”代替。字符间一定不要留空格。



一直感觉这样的填空题应该能用暴力方法破解就用暴力方法解,因为暴力方法思路简单,容易实现,而且因为是填空题,对程序运行时间没有限制,这样就可以省下设计漂亮算法所花费的时间。

这道题也是用暴力算法解决。用一个长度为8的数组模拟牌的序列,用八重循环遍历所有的牌可能的排列顺序,然后判断是否满足题目中的要求,若满足则输出。

#include <iostream>
#include <cstdlib>
using namespace std;
char para[8];
int findit(char a,int index)
{
    for(int i=index;i<8;i++)
    {
          if(para[i]==a)return i;  
    }
}
int main()
{
    char card[8] = {'A','A','2','2','3','3','4','4'};
    for(int i=0;i<8;i++)
    {
            para[0] = card[i];
            for(int i2=0;i2<8;i2++)
            {
                    if(i2==i)continue;
                    para[1] = card[i2];
                    for(int i3=0;i3<8;i3++)
                    {
                            if(i3==i||i3==i2)continue;
                            para[2] = card[i3];
                            for(int i4=0;i4<8;i4++)
                            {
                                    if(i4==i||i4==i2||i4==i3)continue;
                                    para[3] = card[i4];
                                   for(int i5=0;i5<8;i5++)
                                    {
                                           if(i5==i||i5==i2||i5==i3||i5==i4)continue;
                                           para[4] = card[i5];
                                         for(int i6=0;i6<8;i6++)
                                        {
                                                 if(i6==i||i6==i2||i6==i3||i6==i4||i6==i5)continue;
                                                 para[5] = card[i6];
                                                for(int i7=0;i7<8;i7++)
                                                {
                                                        if(i7==i||i7==i2||i7==i3||i7==i4||i7==i5||i7==i6)continue;
                                                        para[6] = card[i7];
                                                       for(int i8=0;i8<8;i8++)
                                                        {
                                                              if(i8==i||i8==i2||i8==i3||i8==i4||i8==i5||i8==i6||i8==i7)continue;
                                                              para[7] = card[i8];
                                                              int in1 = findit('A',0);
                                                              int in2 = findit('A',in1+1);
                                                              int in3 = findit('2',0);
                                                              int in4 = findit('2',in3+1);
                                                              int in5 = findit('3',0);
                                                              int in6 = findit('3',in5+1);
                                                              int in7 = findit('4',0);
                                                              int in8 = findit('4',in7+1);
                                                              //cout<<in1<<" "<<in2<<" "<<in3<<" "<<in4<<" "<<in5<<" "<<in6<<" "<<in7<<" "<<in8<<endl;
                                                              if((in2-in1)==2&&(in4-in3)==3&&(in6-in5)==4&&(in8-in7)==5)
                                                              {
                                                                   for(int i=0;i<8;i++)
                                                                   {
                                                                           cout<<para[i]<<" ";
                                                                   }
                                                                   cout<<endl;
                                                              }  
                                                        } 
                                                }
                                        }   
                                    } 
                            }
                    }
            }
    }
    system("pause");
    return 0;
}

答案:2342A3A4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值