/*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(" "); else printf(" "); } printf("%c", ans[i]); } printf(" %d ",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; }