一,题目链接
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;
}