程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> uva :185 - Roman Numerals(dfs)

uva :185 - Roman Numerals(dfs)

編輯:C++入門知識

題目:uva :185 - Roman Numerals


題目大意:給出一個字符串的等式,問這個字符串是否是羅馬等式嗎?有符合的阿拉伯等式嗎?前者是就輸出correct or incorrect ,後者就得分情況:

ambiguous 能組成阿拉伯等式的字母組合大於等於2, 
valid     能組成阿拉伯等式的字母組合只有1種
impossible 沒有符合阿拉伯等式的字母組合。
解題思路:
1、能不能組成羅馬等式的規則:每個當前的字母(i)的左邊的字母((i-1)所對應的值如果比i所對應的值小的話,i-1的值就取負值,否則就取正值。最後判斷是否等是式左右成立。
2、能不能組成阿拉伯等式的話,就是每個字母都可以用 0 - 9 之間的數字去替代,看是否有是左右兩邊等式成立的。
注意:
0單獨出現,和出現前導0的情況,都是不要的,需要排除。然後相同的字母表示一樣的值。這裡就將每個字母的情況都枚舉出來,然後去掉0出現錯誤的情況,dfs()找出符合的組合。

代碼:
#include 
#include 

const int N = 10;

char str[N * N], s1[3][N];
int s[N * N];
char vis[N * N], head[N * N];
const char *letter = "IVXLCDM";
int	count, size;

void init () {

	s['I'] = 1;
	s['X'] = 10;
	s['C'] = 100;
	s['M'] = 1000;
	s['V'] = 5;
	s['L'] = 50;
	s['D'] = 500;
	size = 0;
}

int trans (char * a) {

	int num = 0, i;
	for (i = 1; i <= strlen (a); i++) {

		if (s[a[i - 1]] >= s[a[i]])
			num += s[a[i- 1]];
		else
			num -= s[a[i - 1]];
	}
	return num;
}

bool is_roman () {

	int n1 = trans(s1[0]);
	int n2 = trans(s1[1]);
	int n3 = trans(s1[2]);
	if (n1 + n2 == n3)
		return true;
	return false;
}

int tran_num (char * a) {

	int num = 0;
	for (int i = 0; i < strlen (a); i++)
		num = num * 10 + s[a[i]];
	return num;
}

void is_numerals (int n, int v) {

	if (n == size) {

		int n1 = tran_num (s1[0]);
		int n2 = tran_num (s1[1]);
		int n3 = tran_num (s1[2]);
		if (n1 + n2 == n3) 	
			count++;
		return ;
	}
	if (v >= 7)
		return;
	while(!vis[letter[v]]) 
		v++;
	if (v < 7) {
		for (int j = 0; j < 10; j++) {

			if (j == 0 && head[letter[v]])
				continue;
			s[letter[v]] = j;
			is_numerals (n + 1, v + 1);
			if (count >= 2)
				return;
		}
	} 
}

int main () {

	int k, j;
	while (scanf ("%s", str) , str[0] != '#') {

		init();
		k = j = 0;
		memset (vis, 0, sizeof (vis));
		memset (head, 0, sizeof (head));
		for (int i = 0; i < strlen (str); i++) {

			if (str[i] != '+' && str[i] != '=' ) {

				s1[k][j++] = str[i];
				if (!vis[str[i]])
					size++;
				vis[str[i]] = 1;
				if (j == 1)
					head[str[i]] = 1;
			} else {

				s1[k][j] = '\0';
				k++;
				j = 0;
			}
		}
		s1[2][j] = '\0';
		printf ("%s ", is_roman() ?"Correct":"Incorrect");

		count = 0;
		is_numerals(0, 0);

		if (!count)
			printf ("impossible\n");
		else {

			if (count == 1)
				printf ("valid\n");
			else
				printf ("ambiguous\n");
		}
	}
	return 0;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved