UVa 10950

题目:有一种编码方式。串仅仅有小写字母构成,每一个小写字母相应一个数字,如今给你妆化后的数字串,

            问有多少个原串与之相应,注意数字串里可能有一个前导0。

分析:搜索。按字母顺序存储映射表,按字母顺序匹配搜索就可以。

说明:注意最多仅仅输出前100个。

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

using namespace std;

char buf[101];

int  code[128];
char maps[128][5];
char letter[128];

int  Count = 0;
char save[101];
void dfs(int s, int d, int n, int m)
{
	if (Count == 100) return;
	char word[101];
	if (s == n) {
		save[d] = 0;
		printf("%s
",save);
		Count ++;
		return;
	}
	for (int k = 0 ; k < m ; ++ k) {
		int count = 0;
		for (int i = s ; i < n ; ++ i) {
			word[count ++] = buf[i];
			word[count] = 0;
			if (!strcmp(word, maps[k]) || (word[0] == '0' && !strcmp(word+1, maps[k]))) {
				save[d] = letter[k];
				dfs(i+1, d+1, n, m);
			}
		}
	}
}

int main()
{
	int  n,t = 1;
	char c;
	while (~scanf("%d",&n) && n) {
		memset(code, 0, sizeof(code));
		for (int i = 0 ; i < n ; ++ i) {
			getchar();
			scanf("%c",&c);
			scanf("%d",&code[c]);
		}
		
		int count = 0;
		for (int i = 'a' ; i <= 'z' ; ++ i)
			if (code[i] > 0 && code[i] < 100) {
				letter[count] = i;
				if (code[i] > 9) {
					maps[count][0] = code[i]/10 + '0';
					maps[count][1] = code[i]%10 + '0';
					maps[count][2] = 0;
				}else {
					maps[count][0] = code[i] + '0';
					maps[count][1] = 0;
				}
				count ++;
			}
		
		scanf("%s",buf);
		printf("Case #%d
",t ++);
		Count = 0;
		dfs(0, 0, strlen(buf), count);
		printf("
");
	}
	return 0;
}

原文地址:https://www.cnblogs.com/clnchanpin/p/6884707.html