一、问题描述
A A 2 2 3 3 4 4,一共有4对扑克牌。请你把它们排成一行。
要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。
请填写出所有符合要求的排列中,字典序最小的那个。
例如:22AA3344比A2A23344字典序小。当然,它们都不是满足要求的答案。
注:请通过浏览器提交答案,“A”一定不要用小写字母a,也不要用“1”代替。字符间一定不要留空格。
二、解题思路
各个元素不变,不同的排列顺序对应一手牌的情况,解空间为8个数的排列问题,但是有重复元素。同时在每得出相应的排序情况中,需要判断其是否满足题干中相应的条件。
三、解答过程
含有重复元素的全排列+条件测试
代码如下(示例):
#include <bits/stdc++.h>
using namespace std;
int number=0;
bool check(string str){
int a1=str.find('A'); //返回相应的字符在字符串中的下标位置
int a2=str.rfind('A'); //从字符串右侧开始寻找相应字符在字符串中的下标位置
int b1=str.find('2');
int b2=str.rfind('2');
int c1=str.find('3');
int c2=str.rfind('3');
int d1=str.find('4');
int d2=str.rfind('4');
if(a2-a1==2&&b2-b1==3&&c2-c1==4&&d2-d1==5){
return true;
}
return false;
}
int main(){
string str="223344AA";
int flag=0;
do{
if(check(str)){
number++;
if(!flag){
cout<<str<<endl;//此时输出的为字典序最小的满足条件的排列
}
flag=1;
}
}while(next_permutation(str.begin(),str.end()));
// cout<<number<<endl; //一共有多少种满足条件的排列
return 0;
}