129 - Krypton Factor

/*UVa129 - Krypton Factor
--回溯问题。看例子可知道确定该字符串是按照从左到右依次考虑每个位置,当前位置填不上所有的字符时,需要回溯。
--
*/
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<fstream>
#include<time.h>
#include<vector>
using namespace std;
const int maxn = 1000;

char ans[maxn];
int k, L, tol;
bool flag;

bool isleg(int curr){
	bool res = 1;
	int i, b;
	for (b = 0; b < curr; b++){
		int len = curr - b + 1;
		if (len & 1)continue;
		for (i = 0; i < len / 2; i++){
			if (ans[b+i] != ans[i + b + len / 2])break;
		}
		if (i == len / 2)res = 0;
		if (!res)break;
	}
	return res;
}
void dfs(int curr){
	if (tol==k){  //搜索到了解
		for (int i = 0; i < curr; i++){
			if (i&&i % 4 == 0){
				if (i%64== 0)printf("\n");
				else printf(" ");
			}
			printf("%c", ans[i]);
		}
		printf("\n%d\n",curr);
		flag = 1;
		return;
	}
	if (flag)return;
	for (char i = 'A'; i < 'A' + L; i++){
		ans[curr] = i;
		if (isleg(curr)){
			tol++;    //合法解,tol++
			dfs(curr + 1);
		}
	}
}
int main(){
	while (scanf("%d%d", &k, &L) && k&&L){
		flag = 0;
		tol = 0;
		dfs(0);
	}
	return 0;
}

  

posted @ 2016-08-30 14:42  曹孟德  阅读(142)  评论(0编辑  收藏  举报