藍橋杯——2014年C++A組第6題:撲克排序【枚舉,全排列】

一、題目

A A 2 2 3 3 4 4, 一共4對撲克牌。請你把它們排成一行。
要求:兩個A中間有1張牌,兩個2之間有2張牌,兩個3之間有3張牌,兩個4之間有4張牌。

請填寫出所有符合要求的排列中,字典序最小的那個。

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

請通過瀏覽器提交答案。“A”一定不要用小寫字母a,也不要用“1”代替。字符間一定不要留空格。

二、思路

事實上題目已經給了提示,“不要用1代替A”,事實上我們就是要用1代替A,最後再根據1輸出A。

用12345678分別代表AA223344的下標。

因爲A和A之間要有一張牌,那麼他們之間的差就是2,以此類推,2和2之間差是3,3和3之間是4,4和4之間是5。

用STL自帶全排列:next_permutation()函數,默認是字典序的升序排列。

三、題解

#include <iostream>
#include <algorithm>
using namespace std;
int num[8]={1,2,3,4,5,6,7,8};

int find (int a)
{
    for (int i=0;i<8;i++)
    {
        if(num[i]==a)
        {
            return i;
        }
    }
    return -1;
}

int main()
{
    int a;
    int b;
    int flag;
    do
    {
        flag=1;
        a=find(1);
        b=find(2);
        if(abs(a-b)!=2)
        {
            flag=0;
            continue;
        }
        a=find(3);
        b=find(4);
        if(abs(a-b)!=3)
        {
            flag=0;
            continue;
        }
        a=find(5);
        b=find(6);
        if(abs(a-b)!=4)
        {
            flag=0;
            continue;
        }
        a=find(7);
        b=find(8);
        if(abs(a-b)!=5)
        {
            flag=0;
            continue;
        }
        if(flag)
        {
            for(int i=0;i<8;i++)
            {
                if(num[i]==1 || num[i]==2)
                {
                    cout << "A" ;
                }
                else
                {
                    cout << (num[i]+1)/2;
                }
            }
            cout << endl;
        }
    }while(next_permutation(num,num+8));
    return 0;
}

 

四、結果


2342A3A4
4A3A2432
 

Process finished with exit code 0

要找出字典序較小的一個,那麼自然那然是2342A3A4

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章