题目:https://vjudge.net/problem/UVA-129

解题思路:


回溯法(for循环实现)

参考n皇后问题的解题思路:如欲把皇后放在(cur,i)单元格,则要判断当前(cur,i)位置的皇后是否和之前已经放置好的皇后产生冲突,而不是判断以前的皇后之间是否产生冲突。因为这种方法保证了之前放置的皇后之间一定不存在冲突。

同样的道理:对于题目中output给出的字符串们:

AB是在A的基础上产生的,AA不可以,AB可以

ABA是在AB的基础上产生的

ABAC是在ABA的基础上产生的,ABAA不可以(从后缀开始向前判断),ABAB不可以,ABAC可以

依次类推

所以只需要判断当前串的后缀,而非所有子串!

注意:

解只输出一次即可,所以要控制递归结束的条件!!!

不要有多余的空格,样例中第二个输出的字符串的末尾不应该有空格,否则会PE

最后一个输出的数字后面有换行不会报PE

ac代码:


#include <iostream>
#include <cmath>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
#define maxn 100
using namespace std;
typedef long long ll;
int n,L,numb;
char ans[maxn];
char a[27]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
bool is_hard(char ans[],int cur)
{bool hard;int num=1;while(num*2<=(cur+1)){hard=false;for(int i=0;i<num;i++){if(ans[cur-i]!=ans[cur-num-i])//ABACAB 6-2-2 6-2{hard=true;//困难字符串break;}}if(!hard) return false;//只要在比较的过程中有一次比较失败即returnnum++;}return true;}
int  answer(int cur)//cur个
{if(numb==n){int i;for( i=0;i<cur;i++){printf("%c",ans[i]);if(i%4==3){if((i/4)==15)//16*4=64,最多只有一行多,(16*4-1)/4=15printf("\n");else if(i!=(cur-1))printf(" ");}}if(i!=63)printf("\n");printf("%d\n",cur);return 0;}else {for (int i = 0; i < L; i++){ans[cur]=a[i];if(is_hard(ans,cur)){numb++;if(!answer(cur + 1)) return 0;}}}return  1;
}
int main()
{//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);while(scanf("%d %d",&n,&L)){if(n==0&&L==0) break;numb=0;ans[0]='\0';answer(0);}return 0;
}

【UVA129】Krypton Factor(回溯+在回溯法的基础上判断一个字符串是否有相邻的重复子串(后缀))相关推荐

  1. Uva129 Krypton Factor【dfs回溯】【例题7-5】

    题目:Krypton Factor 题意:如果一个字符串包含两个相邻的重复子串,则称它是"容易的串",其他串称为"困难的串".输入n,L,输出由前L个字符组成的 ...

  2. 回溯法之避免无用判断 UVA129 Krypton Factor困难的串

    题意:如果一个字符串包含两个相邻的重复子串,则称它是"容易的串",其他串称为"困难的串" 输入正整数n和L,输出由前L个字符组成的并且它的字典序是第n小的串,和 ...

  3. UVa129 Krypton Factor

    回溯法. 使用26个字母中前L个字母,要求输出一个不存在相同的相邻子串的序列,该序列应是所有合法序列中字典序第N小的. DFS枚举所有可行序列,因为序列长度不定所以解答树中除根节点之外的每个结点都算合 ...

  4. c语言用递归法判断回文字符串,递归方式判断一个字符串是否为回文字符串

    /* * 递归方式判断一个字符串是否为回文字符串 */ public class PartitionTest{ public static void main(String[] args) { Str ...

  5. UVA - 129 Krypton Factor (困难的串)(回溯法)

    题意:求由字母表前L个字母组成的字典序第n小的困难串.(如果一个字符串包含两个相邻的重复子串,则称它是"容易的串",其他串称为"困难的串".) 分析:回溯时,检 ...

  6. 多字段回溯 mysql_回溯算法 | 追忆那些年曾难倒我们的八皇后问题

    前言 说起八皇后问题,它是一道回溯算法类的经典问题,也可能是我们大部分人在上数据结构或者算法课上遇到过的最难的一道题-- 在这里插入图片描述 第一次遇到它的时候应该是大一下或者大二这个期间,这个时间对 ...

  7. Krypton Factor UVA - 129

    题目链接:Krypton Factor UVA - 129 #include<iostream> #include<string> #include<cstdio> ...

  8. 129:Krypton Factor

    Krypton Factor 注意 && 别写成 & 了... #include<bits/stdc++.h> using namespace std; const ...

  9. 数字拆分问题算法回溯_回溯算法

    知乎上有类似的文章,不过是用python讲解,我改成JS了,并加了不少题目. 78 .子集 题目描述:给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重 ...

  10. leetcode刷题笔记——剑指offer(二)[回溯、排序、位运算、数学、字符串]

    这里写目录标题 搜索与回溯 剑指 Offer 12. 矩阵中的路径 剑指 Offer 13. 机器人的运动范围 剑指 Offer 34. 二叉树中和为某一值的路径 剑指 Offer 36. 二叉搜索树 ...

最新文章

  1. Nginx从基本原理到开发实践
  2. 服务器响应时延,服务器响应时延
  3. 关于DSP开发的步骤
  4. textView不能完全显示时,滚动显示
  5. 巧用lock解决缓存击穿的解决方案
  6. Python SQLAlchemy --3
  7. 多股回测(backtrader+quantstats+akshare)
  8. android canvas_Android 自定义View篇(七)实现环形进度条效果
  9. android执行lua脚本的方法,从Android应用程序调用Lua脚本
  10. SSM中(Spring-SpringMVC-Mybatis)(二:整合)
  11. bzoj 1133: [POI2009]Kon(DP)
  12. 用POP动画编写带富文本的自定义动画效果
  13. stm32时钟和通信方式及stm32cubemx 配置usart通信
  14. Docker技术之容器与外部相连
  15. CSS border-image(边框图片)
  16. 服务器ping不通网址!
  17. web服务之LAMPLNMP架构
  18. 【OpenIM原创】uni-app使用之 初始化会话 消息 好友 监听器
  19. 避免localStorage被更改 让localStorage禁止修改值
  20. 数据库重构工具 LiquiBase(5 Liquibase被锁)

热门文章

  1. [Share]如何做好一份前端工程师的简历?
  2. C语言实现数字串转数字
  3. 在Lua中“优雅”地使用Protobuf
  4. 计算机培训实践反思模板,基于问题解决式课堂教学模式的反思
  5. oracle安装蓝屏_Windows下安装ORACLE RAC蓝屏无限重启
  6. prometheus linux下载_Prometheus笔记
  7. c++ 多线程 类成员函数_C++11多线程
  8. 数据签名 RSA算法
  9. 谈谈BFC与ie特有属性hasLayout
  10. SQL Server中的事务日志管理(6/9):大容量日志恢复模式里的日志管理