一、题目
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