UVA 129 - Krypton Factor

    xiaoxiao2025-12-07  3

    #include <bits/stdc++.h> #define _ ios_base::sync_with_stdio(0);cin.tie(0); #define INF 0x3f3f3f3f #define eps 1e-6 typedef long long LL; const double pi = acos(-1.0); const long long mod = 1e9 + 2015; using namespace std; int N,T; char s[105]; int cnt; bool judge(int cur) { for(int i = 1;i <= (cur + 1) / 2;i++) { bool e = 1; for(int j = 0;j < i;j++) if(s[cur - i - j] != s[cur - j]) { e = 0; break; } if(e) return false; } return true; } void output(int cur) { for(int i = 0;i <= cur;i++) { if(i % 4 == 0 && i > 0) { if(i % 64 == 0 && i > 0) putchar('\n'); else putchar(' '); } putchar(s[i]); } printf("\n%d\n", cur + 1); } int dfs(int cur) { for(int i = 0;i < T;i++) { s[cur] = 'A' + i; if(judge(cur)) { cnt++; if(cnt == N) { s[cur + 1] = 0; output(cur); return 1; } if(dfs(cur + 1)) return 1; } } return 0; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); //freopen("int.txt","r",stdin); //freopen("out.txt","w",stdout); int first = 0; int t = 0; while(cin >> N >> T) { if(N == 0 && T == 0) break; cnt = 0; dfs(0); } return 0; } #include <iostream> #include <string> using namespace std; //递归过程,顺序生成所有的字串。str保存结果,n和L为题目中给出的同名变量 void Sequence(string &str, int &n, int L) { //记录字串长度,以加快运算 int nLen = str.length(), nHalf = (str.length() + 1) / 2; //在结果字串后面依次尝试添加前L个大写字母 for (char i = 'A', iEnd = L + 'A', m = 1; i < iEnd; ++i) { str.push_back(i); //插入当前字符 //下面判断新生成的字符串中是否存在相邻的重复 //第1次判断最后1个字符,第2次判断最后2个字符,以此类推 for (m = 1; m <= nHalf; ++m) { //将最后的i个字符与之前的i个字符比较,如果有相同则跳出 if (equal(str.end() - m, str.end(), str.end() - m * 2)) { m = 0; //将m置为0表示存在重复的相邻子串 break; //跳出循环 } } if (m != 0) { //如果不存在重复 //如果生成的字串已经够数,返回上一级 if (--n == 0) return; Sequence(str, n, L); //进入下一级调用 //如果生成的字串已经够数,返回上一级 if (n == 0) return; } //删除刚添加在后面的字符,保持结果字串在进入这一级时的原状 str.erase(nLen); //准备为添加下一个字符作准备 } } //主函数 int main(void) { for (int n, L; cin >> n >> L && n != 0; ) { //循环读取每一组输入的数据 string str; //结果字符串 Sequence(str, n, L); //递归生成所有的无相邻重复字串 int nLen = str.length(); //保留生成字串的字符数量 for (size_t i = 4; i < str.length(); i += 5) { //按格式处理字串 //每隔4个插入一个空格,每隔80字符插入一个回车 str.insert(str.begin() + i, i == 79 ? '\n' : ' '); } //输出结果字串和字符数量 cout << str << '\n' << nLen << endl; } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-1304698.html
    最新回复(0)