<OJ_Sicily>生成字符串
来源:互联网 发布:windows仿mac dock栏 编辑:程序博客网 时间:2024/06/07 17:42
Description
假设一个字符串只由字符‘0’,‘1’,‘?’组成,其中字符‘?’表示该字符可由字符‘0’或‘1’替代。
现有一些字符串,根据这些字符串生成所有可生成的字符串。
如:{10,?1,0? }可生成{10,01,11,00}
{101,001,?01}可生成{101,001}
注意后一个例子中‘?01’并没有生成新的字符串。
Input
输入包含多组测试数据。
每组数据的第一行是两个整数M,N(1≤M≤15,0≤N≤2500)。M表示字符串的长度,N表示字符串的个数。两个整数之间由一个空格隔开。以下N行每行各有一个字符串。文件中各行的行首、行末没有多余的空格。
当M=N=0时表示输入结束。
解题思路:主要的思路是对于输入的字符串,将其当做数字看待,对于'?'则分别用0和1代替。这里使用的是回溯算法求解。用一个一维数组,对于已经存在的数进行标记。
#include <iostream>#include <string.h>using namespace std;char inStr[18];bool is_existed[1<<16];int M, N;int Total;void backtrack(int presum, int k){ if (inStr[k] == '\0') { // 字符串已输入完毕 if (!is_existed[presum]) { // 该字符串是否已经存在 is_existed[presum] = true; Total ++; } } else if(inStr[k] == '?'){ backtrack(presum << 1, k+1); // 使用0代替?,进行下一步统计 backtrack((presum << 1) + 1, k +1); // 使用1代替?,进行下一步统计 } else{ presum = (presum << 1) + inStr[k] -'0'; //进行下一步统计 backtrack(presum, k+1); }}int main(){ while (cin >> M >> N) { if (M == 0 && N == 0) break; memset(is_existed, false, sizeof(is_existed)); Total = 0; for (int i = 0; i < N; i++) { cin >> inStr; backtrack(0, 0); } cout << Total << endl; } return 0;}
0 0
- <OJ_Sicily>生成字符串
- <OJ_Sicily>Fibonacci
- <OJ_Sicily>Hanoi_Tower_Sequence
- <OJ_Sicily>Maze
- <OJ_Sicily>Bicoloring
- <OJ_Sicily>DAG
- <OJ_Sicily>Forest
- <OJ_Sicily>Maze
- <OJ_Sicily>Rails
- <OJ_Sicily>Pair
- <OJ_Sicily>Polynomial
- <OJ_Sicily>Connection
- <OJ_Sicily>Single-link Clustering
- <OJ_Sicily>Order Crossover
- <OJ_Sicily>N_Queen Problem
- <OJ_Sicily>1134积木分发
- <OJ_Sicily>1438Shopaholic
- <OJ_Sicily>Travelling Salesman Problem
- 二分算法C实现
- 关于安卓模拟器无法访问WebStorm网页问题
- Android Studio MAC版 代码提示快捷键
- Java MD5代码实现分析
- Hadoop2.6.4伪分布式安装
- <OJ_Sicily>生成字符串
- 腾讯17年暑期实习生笔试题 - 构造回文
- 面试:哈希:最长不同字符
- UEditor之实现配置简单的图片上传示例
- 数据结构与算法之六 双向链表和循环链表
- spring中的aop简单编程
- 2016-06-11 星期六 18:28:27 下午
- 4K播出(下)
- Egret教程(二、HelloWorld)