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;
}

 

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