uva 129 krypton factors ——yhx
2016-03-24 23:30
274 查看
Krypton Factor |
For example, the sequence ABACBCBAD is easy, since it contains an adjoining repetition of the subsequence CB. Other examples of easy sequences are:
BB
ABCDACABCAB
ABCDABCD
Some examples of hard sequences are:
D
DC
ABDAB
CBABCBA
Input and Output
In order to provide the Quiz Master with a potentially unlimited source of questions you are asked to write a program that will read input lines that contain integers n and L (in that order), where n > 0 and L is in the range, and for each input line prints out the nth hard sequence (composed of letters drawn from the first L letters in the alphabet), in increasing alphabetical order (alphabetical ordering here corresponds to the normal ordering encountered in a dictionary), followed (on the next line) by the length of that sequence. The first sequence in this ordering is A. You may assume that for given n and L there do exist at least n hard sequences.
For example, with L = 3, the first 7 hard sequences are:
A
AB
ABA
ABAC
ABACA
ABACAB
ABACABA
AB
ABA
ABAC
ABACA
ABACAB
ABACABA
As each sequence is potentially very long, split it into groups of four (4)
characters separated by a space. If there are more than 16 such groups,
please start a new line for the 17th group.
Therefore, if the integers 7 and 3 appear on an input line, the output lines
produced should be
ABAC ABA 7
Input is terminated by a line containing two zeroes. Your program may assume a maximum sequence length of 80.
#include<cstdio> int a[100],n,l,t; void prt(int p) { int i; for (i=1;i<=p;i++) { printf("%c",a[i]-1+'A'); if (i%64==0||i==p) printf("\n"); else if (i%4==0) printf(" "); } printf("%d\n",p); } void dfs(int cur) { if (t==n) { prt(cur-1); return; } int i,j,k,p,q,x,y,z; bool b,bb; for (i=1;i<=l;i++) { a[cur]=i; bb=1; for (j=1;j*2<=cur;j++) { b=0; for (k=cur-j+1;k<=cur;k++) if (a[k-j]!=a[k]) { b=1; break; } if (!b) { bb=0; break; } } if (bb) { t++; dfs(cur+1); if (t>=n) return; } } } int main() { while (scanf("%d%d",&n,&l)&&n&&l) { t=0; dfs(1); } }
在每填一位时,检查以他为终点的所有连续的两个长度相同的子串,如果都不相同则满足。因为以他之前的字符结尾的所有相邻且长度相等的子串对都已经在之前验证过合法了。
用一个计数器统计目前得到的解的个数,注意退出条件(一旦达到个数要退出所有子函数)。
dfs时不需回溯,甚至每组数据都不用清零,因为之后填的会覆盖之前填的。
相关文章推荐
- 【C#进阶系列】15 数组
- 智能指针(模拟实现auto_ptr,shared_ptr,scooeptr 以及定制删除器c++ 实现)
- 删除a3.txt文件中含dong的行
- AngularJS+ckEditor管理ng-model
- Bootstrap_面板
- LeetCode 128. Longest Consecutive Sequence
- Dijkstra找最短路径
- java小程序之(GUI)确认对话框JOptionPane.showConfirmDialog
- 深入理解RunLoop
- 变量、数据类型和运算符
- 三维图像技术与OpenGL基础理论
- ProgressDialog的详细使用总结
- 数据存储
- Dubbo学习(三):启动时检查
- java 六大原则
- 机器学习之pip安装scikit-learn问题解决
- 如何从零开始学习Ruby
- validator 使用案例
- Bootstrap_列表组
- sessionid如何产生?由谁产生?保存在哪里?