首页 > 代码库 > UVa 628 - Passwords

UVa 628 - Passwords

题目:给你一个单词的字典,一个由0与#组成的字符串,0代表数字0-9,#代表字典中的单词;

            输出所有的0#串的表示方式,统一句子中的#代表一个单词。

分析:搜索。打表计算出所有的数字的排列情况,然后枚举输出即可。

说明:P(10,7)当成P(7,7)数字开小了,RE了好几次。

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>

using namespace std;

char words[111][300],rule[300];
int  buf[605000][11],save[11],number;

void dfs(int d, int n)
{
	if (d == n) {
		for (int i = 0 ; i < n ; ++ i)
			buf[number][i] = save[i];
		number ++;
		return;
	}
	for (int i = 0 ; i < 10 ; ++ i) {
		save[d] = i;
		dfs(d+1, n);
		save[d] = i;
	}	
}

int main()
{
	int n,m; 
	while (~scanf("%d",&n)) {
		for (int i = 0 ; i < n ; ++ i)
			scanf("%s",words[i]);
		scanf("%d",&m);
		printf("--\n");
		for (int i = 0 ; i < m ; ++ i) {
			scanf("%s",rule);
			int count = 0;
			for (int j = 0 ; rule[j] ; ++ j)
				count += (rule[j]=='0');
			number = 0;
			dfs(0, count);
			for (int j = 0 ; j < n ; ++ j)
			for (int p = 0 ; p < number ; ++ p) {
				for (int deep = 0,k = 0 ; rule[k] ; ++ k) {
					if (rule[k] == '#')
						printf("%s",words[j]);
					if (rule[k] == '0') 
						printf("%d",buf[p][deep ++]);
				}
				printf("\n");
			}
		}
	}
    return 0;
}


UVa 628 - Passwords