Dfs+最小序位+重复元素的位置判断
A A 2 2 3 3 4 4, 一共4对扑克牌。请你把它们排成一行。
要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。
请填写出所有符合要求的排列中,字典序最小的那个。
例如:22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。
#include <iostream>
#include<string.h>
#include<math.h>
using namespace std;
int initial[10] = {1,1,2,2,3,3,4,4};
int seq[10];
char minseq[10];//由于minseq【10】用于比较所有情况!必然定义为全局变量!
int valsub[5][2]; //下标从1开始,表示两个1、两个2、两个3、两个4之间的下标之差
int used[10]={0};
int num = 8;
int judge()
{
int vis[5]={0};//主要看4对扑克牌有没有被标记!
for(int i = 0; i < num; ++i)
{ if(vis[seq[i]] == 0)
{
valsub[seq[i]][0] = i;//记录每对其中一张扑克位置,并标记
vis[seq[i]] = 1;
}
else
valsub[seq[i]][1] = i;
}
for(int i = 1; i <= 4; ++i)//判断位置是否可行
if(abs(valsub[i][0] - valsub[i][1]) != i + 1)
return 0;
return 1;
}
void getsmaller()
{
char s[10];
int flag = 1;
for(int i = 0; i < 8; ++i)
{
if(seq[i] == 1)
s[i] = 'A';
else
s[i] = seq[i] + '0'; //注意这种char型赋值方式!
} // char x=’0’+int 或char x=’a’+int ,总之为char x=ACSELL+int的类强制转换
for(int i = 0; i < 8; ++i) //查找最小序列,有点类似冒泡排序
{
if(minseq[i] < s[i])
{
flag = 0;
break;
}
}
if(flag)
{
for(int i = 0; i < 8; ++i)
minseq[i] = s[i];
}
}
void dfs(int idx)
{
//idx:当前要操作的第idx个位置
if(idx == num)
{
if(judge())//判断是否符合条件
getsmaller();//获得一个更小的序列
return ;
}
for(int i = 0; i < num; ++i)
{
if(!used[i])
{
seq[idx] = initial[i];
used[i] = 1;
dfs(idx + 1);
seq[idx] = 0;
used[i] = 0;
}
}
}
int main()
{
for(int i = 0; i < 8; ++i)
minseq[i] = 'Z'; //先将minseq数组初始化
dfs(0);
for(int i = 0; i < 8; ++i)
cout<<minseq[i];
return 0;
}
注意知识点!
1. 总框架为
Int main()
{ for(int i = 0; i < 8; ++i)
minseq[i] = 'Z'; //先将minseq数组初始化
Dfs();
for(int i = 0; i < 8; ++i)//输出
cout<<minseq[i];
}
void dfs(int idx)
{
if(idx == num)//判断
{
if(judge())//判断是否符合条件
getsmaller();//获得一个更小的序列
return ;
}
for(int i = 0; i < num; ++i)//dfs赋值
}
2.
char minseq[10];//由于minseq【10】用于比较所有情况!必然定义为全局变量!
int valsub[5][2]; //下标从1开始,表示两个1、两个2、两个3、两个4之间的下标之差
3.
int judge()
4. s[i] = seq[i] + '0'; //注意这种char型赋值方式!
// char x=’0’+int 或char x=’a’+int ,总之为char x=ACSELL+int的类强制转换
5.查找最小序列!
for(int i = 0; i < 8; ++i) //查找最小序列,有点类似冒泡排序
{
if(minseq[i] < s[i])
{
flag = 0;
break;
}
}