0.这道题的输出 处理起来挺麻烦的
以后类似的可以借鉴一下
for(int i=0;i<cur;i++) { if(i!=0 && i%64==0) printf("\n%c",a[i]); else if(i!=0 && i%4==0) printf(" %c",a[i]); else printf("%c",a[i]); }
1.还有一个是输出 第n小 怎么来控制第n小 利用的是一个初始化为0的cnt 每当满足所有条件 进入递归边界的时候 判断一下cnt是否等于n 然后cnt++
初始化为0的原因是 第一次在主函数中调用的时候 执行判断语句 cnt++ == n的时候 cnt就更新为1了,所以是初始化为0而不是1.
2.是判断是否是简单的串的方法
这是一个由前L个字符组成的字符串,所以有一个i<l的for循环和 a[cur]=‘A‘+i;的语句
int ok为1 表示困难串,因为 判断完之后是困难串,才进入递归dfs
之后,我们是判断后缀是否相同,而不是整个字符串拿来判断,那样会做很多重复的工作导致效率下降。
初始化isequal=1,然后开始判断,一旦发现不等的,就isequal=0然后break
在循环外面 判断 if(isequanl==1) 如果是1 则是简单串 则ok=0;
如果ok==1 则进入递归 就是这样一个逻辑
for(int i=0;i<l;i++) { a[cur]=‘A‘+i; int ok=1; for(int j=1;j*2<=cur+1;j++) { int isequal=1; for(int k=0;k<j;k++) if(a[cur-k]!=a[cur-j-k]) {isequal=0;break;} if(isequal==1) { //如果是简单串 则ok=0; ok=0;break; } } if(ok==1 && getans==false) dfs(cur+1); }
3. 得到答案之后记得更新getans 为true 终止剩下的dfs 不然会一直输出
或者 dfs加入返回值,递归搜索过程中如果有一个成功,就直接退出!!! 使用int型的dfs 找到答案后return 0 其余dfs均return 1
if(ok) if(!dfs(cur+1)) return 0;
1 #include <cstdio> 2 int n,l,cnt; 3 char a[90]; 4 bool getans; 5 void dfs(int cur) 6 { 7 if(cnt++ == n) 8 { 9 getans=true; 10 for(int i=0;i<cur;i++) 11 { 12 if(i!=0 && i%64==0) 13 printf("\n%c",a[i]); 14 else if(i!=0 && i%4==0) 15 printf(" %c",a[i]); 16 else 17 printf("%c",a[i]); 18 } 19 printf("\n"); 20 21 printf("%d\n",cur); 22 } 23 for(int i=0;i<l;i++) 24 { 25 a[cur]=‘A‘+i; 26 int ok=1;//ok=1表示困难的串 27 for(int j=1;j*2<=cur+1;j++) 28 { 29 int isequal=1; 30 31 for(int k=0;k<j;k++) 32 if(a[cur-k]!=a[cur-j-k]) 33 {isequal=0;break;} 34 35 if(isequal==1) 36 { 37 //如果是简单串 则ok=0; 38 ok=0;break; 39 } 40 } 41 if(ok==1 && getans==false) dfs(cur+1); 42 } 43 } 44 int main() 45 { 46 while(scanf("%d%d",&n,&l)!=EOF) 47 { 48 if(n==0 && l==0) break; 49 getans=false; 50 cnt=0; 51 dfs(0); 52 } 53 54 return 0; 55 }
时间: 2024-10-27 09:08:18