问题描述:A A 2 2 3 3 4 4, 一共4对扑克牌。请你把它们排成一行。
要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。
请填写出所有符合要求的排列中,字典序最小的那个。
要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。
请填写出所有符合要求的排列中,字典序最小的那个。
例如:22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。
依然套的模板,但是不知道如何消除重复。但是本题重复并不影响最终结果。菜鸟做法,欢迎批评。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int judge(char b[])
{
int i;
for(i = 0 ; i < strlen(b) ; i++)
{
if(b[i] == 'A')
{
if(b[i + 2] == 'A')break;
return 0;
}
}
for(i = 0 ; i < strlen(b) ; i++)
{
if(b[i] == '2')
{
if(b[i + 3] == '2')break;
return 0;
}
}
for(i = 0 ; i < strlen(b) ; i++)
{
if(b[i] == '3')
{
if(b[i + 4] == '3')break;
return 0;
}
}
for(i = 0 ; i < strlen(b) ; i++)
{
if(b[i] == '4')
{
if(b[i + 5] == '4')break;
return 0;
}
}
return 1;
} //判断是否满足两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。
void f(char* b,int loc)
{
if(loc == strlen(b) - 1)
{
if(judge(b) == 1)printf("%s\n",b);
return;
}
for(int i = loc ; i < strlen(b) ; i++)
{
char t = b[i];
b[i] = b[loc];
b[loc] = t;//交换
f(b,loc + 1);
char m = b[i];
b[i] = b[loc];
b[loc] = m;//回溯
}
}
int main()
{
char* s=malloc(100);
gets(s);
f(s,0);
}
结果:可见字典顺序最小的是2342A3A4
//3.13
补充:今天看了老师的视频讲解,终于知道如何去掉重复了,所以将改进后的代码记录一下。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int judge(char b[])
{
int i;
for(i = 0 ; i < strlen(b) ; i++)
{
if(b[i] == 'A')
{
if(b[i + 2] == 'A')break;
return 0;
}
}
for(i = 0 ; i < strlen(b) ; i++)
{
if(b[i] == '2')
{
if(b[i + 3] == '2')break;
return 0;
}
}
for(i = 0 ; i < strlen(b) ; i++)
{
if(b[i] == '3')
{
if(b[i + 4] == '3')break;
return 0;
}
}
for(i = 0 ; i < strlen(b) ; i++)
{
if(b[i] == '4')
{
if(b[i + 5] == '4')break;
return 0;
}
}
return 1;
} //判断是否满足两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。
void f(char* b,int loc)
{
if(loc == strlen(b) - 1)
{
if(judge(b) == 1)printf("%s\n",b);
return;
}
char* history = malloc(20); //用于记录已经交换过的字符
int count = 0;
for(int i = loc ; i < strlen(b) ; i++)
{
if(strchr(history,b[i]) != NULL)continue; //若已经交换过b[i]对应的字符,则直接进入下一次循环
history[count++] = b[i];
char t = b[i];
b[i] = b[loc];
b[loc] = t;//交换
f(b,loc + 1);
char m = b[i];
b[i] = b[loc];
b[loc] = m;//回溯
}
}
int main()
{
char* s=malloc(100);
gets(s);
f(s,0);
}
运行结果:
//3.16