标题:扑克序列
A A 2 2 3 3 4 4, 一共4对扑克牌。请你把它们排成一行。
要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。
请填写出所有符合要求的排列中,字典序最小的那个。
例如:22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。
答案:2342A3A4
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