本题用dfs构造字符串,如何巧妙的判断是否有重复字符串呢。实际上还是dp思想,因为前cur-1个字符是合法的,只需要判断加入第cur后是否合法即可。因此从第cur位到中间位尝试比较前面相等长度字符串即可。
鉴于新手容易写错回溯条件发下源码:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<queue>
#include<string>
#include<vector>
#include<deque>
#include<fstream>
#include<cmath>
#include<functional>
#define ll long long
#define clr(a,v) memset(a,v,sizeof(a))
using namespace std;
const int inf = 0x3f3f3f3f;
using namespace std;
const int N = 105;
int n, m;
int ans[N];
void dfs(int cur) {
if (n <= 0)return;
for (int i = 0; i < m; i++) {
ans[cur] = i;
bool equal = false;
for (int j = 1; 2 * j <= cur + 1; j++) {
bool flag = false;
for (int k = 0; k < j; k++) {
if (ans[cur - j - k] != ans[cur - k]) {
flag = true;
break;
}
}
if (!flag) {
equal = true;
break;
}
}
if (equal)continue;
if (--n == 0) {
for (int i = 0; i <= cur; i++) {
if (i&&i % 64 == 0)
printf("\n");
else if (i&&i % 4 == 0)
printf(" ");
printf("%c", 'A' + ans[i]);
}
printf("\n%d\n", cur + 1);
return;
}
dfs(cur + 1);
}
}
int main() {
ios::sync_with_stdio(false); cin.tie(0);
while (cin >> n >> m) {
dfs(0);
}
return 0;
}