FOJ 1055

一,題目鏈接

http://acm.fzu.edu.cn/problem.php?pid=1055

二,題目描述

三,題目分析

1.程序段的格式是已知的,一行爲三個字符,且中間是賦值運算符,只需用一個數組記錄字符是否 是已知的(查表法)

2.需要考慮情況如下:2.1  n = -1 時,程序結束

                                   2.2   n = 0時,只有a是已知的

                                   2.3     當賦值運算符後面是數字時,則賦值運算符前面的變量標記爲已知

                                   2.4 當賦值運算符後面是有確定值時,則賦值運算符前面的變量標記爲已知

                                   2.5當賦值運算符後面是沒有確定值時,則賦值運算符前面的變量標記也同樣沒有確定值

                                   2.6注意輸出格式,最後一個字符不含空格,直接換行

四,代碼解答

#include<iostream>
#include<string>
#include<vector>
using namespace std;

void fun(string str, vector<bool> &vec) {
	if (str[2] <= '9' && str[2] >= '0') {		//如果類似於  變量==數字
		vec[str[0] - 'a'] = true;
	}
	else if (vec[str[2] - 'a'] == true) {		//後面的變量有確定值,則前面的變量也有確定值
		vec[str[0] - 'a'] = true;
	}
	else if (vec[str[2] - 'a'] == false) {		//後面的變量無確定值,則前面的變量也無確定值
		vec[str[0] - 'a'] = false;
	}
	
}


int main() {
	int n;
	while (cin >> n) {
		if (n == -1) {
			break;
		}
		
		vector<bool> judge(100, false);				//判斷是否是確定值的
		judge[0] = true;								//a 有確定值
		vector<string> vec(n);
		for (int i = 0; i < n; i++) {
			cin >> vec[i];
			fun(vec[i], judge);
		}
		int flag = 0;
		int k=0;
		for (int j = 25; j >= 0; j--) {		//k記錄最後一個有確定值得下標
			if (judge[j] == true) {
				k = j;
				break;
			}
		}
		for (int i = 0; i < 26; i++) {
			if (judge[i] == true) {
				flag = 1;
				if (i != k) {
					printf_s("%c ", i + 'a');
				}
				else
				{
					printf_s("%c\n", i + 'a');		//最後一位不輸出空格,換行
				}
				
			}
		}
		if (flag == 0) printf("none\n");
		//cout << endl;

	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章