编写程序,产生由2,3,5这3个数字符号所构成、长度为n的字符串,并且在字符串中对于任何一个子串而言,都不会有相邻的、完全相同的子串;
Input
字符串长度n(1<=n<=15);
Output
无相邻重复子串的所有字符串,每个字符串换行输出。
递归生成函数
#include<stdio.h>
int a[16],b[4]={2,3,5},n;
void dfs(int n1)
{
int i,j,t,m,flog;
if(n1==n)
{
for(i=0;i<n1;i++)
{
printf("%d",a[i]);
}
puts("");
return ;
}
for(i=0;i<3;i++)
{
flog=0;
a[n1]=b[i];
if(n1>0)
{
for(j=n1;j>=0;j--)
{
m=n1-j+1;//记录判定数组的长度
if(m>j)break;
for(t=j;t<=n1;t++)
{//从后往前
if(a[t-m]!=a[t])break;
}//for
if(t==n1+1)flog=1;
}//for
}
if(flog)continue;
a[n1]=b[i];
dfs(n1+1);
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
dfs(0);
}
system("pause");
return 0;
}
int a[16],b[4]={2,3,5},n;
void dfs(int n1)
{
int i,j,t,m,flog;
if(n1==n)
{
for(i=0;i<n1;i++)
{
printf("%d",a[i]);
}
puts("");
return ;
}
for(i=0;i<3;i++)
{
flog=0;
a[n1]=b[i];
if(n1>0)
{
for(j=n1;j>=0;j--)
{
m=n1-j+1;//记录判定数组的长度
if(m>j)break;
for(t=j;t<=n1;t++)
{//从后往前
if(a[t-m]!=a[t])break;
}//for
if(t==n1+1)flog=1;
}//for
}
if(flog)continue;
a[n1]=b[i];
dfs(n1+1);
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
dfs(0);
}
system("pause");
return 0;
}