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; }