uva129||hdu 1627 Krypton Factor 回溯法

本文介绍了一种使用前l个大写英文字母生成困难字符串的算法。困难字符串是指不包含任何相邻重复子串的字符串。文章详细展示了如何通过深度优先搜索(DFS)策略递归地构造这些字符串,并遵循特定格式进行输出。
题意:用前l个大写的字母构成没有相邻子串的字符串,这种串称作困难串,求出前n个困难串,并按格式输出
#include<cstdio>
using namespace std;
int n,l,cnt;
char a[100];
bool dfs(int cur)
{
	if(cnt++==n)
	{
		for(int i=0;i<cur;i++)
		{
			if(i%64==0&&i)printf("\n");
			else if(i%4==0&&i)printf(" ");
			printf("%c",a[i]+'A');
		}
		printf("\n");
		printf("%d\n",cur);
		return true;
	}
	for(int i=0;i<l;i++)
	{
		a[cur]=i;//试探i
		int ok=1;
		for(int j=1;j*2<=cur+1;j++)
		{
			int equal=1;
			
			for(int k=0;k<j;k++)//检查长度为j的子串是否相等 a[cur-2*j+1~ cur-j]		a[cur-j+1 ~ cur]  
			{
				if(a[cur-k]!=a[cur-j-k])					//cur-2*j+1>=0  	2*j<=cur+1
				{
					equal=0;break;
				}
			}
			if(equal)
			{
				ok=0;
				break;//有相同相邻子串,不符,不能继续递归,继续试探
			}
		}
		if(ok)
		{
			if(dfs(cur+1))return true;
		}
	}
	return false;
}
int main()
{
	while(scanf("%d%d",&n,&l)&&(n+l))
	{
		cnt=0;
		dfs(0);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值