<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
原创粉丝点击