题意
求出含N(0≤N≤100)行的程序段运行以后有哪些变量中有确定的值(a出现时,他是确定的)
第一行输入N,表示后面有N行数据
随后N行数据,诸如“b=a”
思路
-
第一个版本的思路(WA)
定义字符数组arr[],长度len,存放确定值的字符
每读入一行数据:
①判断:left或right中出现a且len=0(初始只有a是有值的,所以在a第一次出现以前不可能有变量是有值的;len不为0则表示a已经添加过了,不需要重复添加),则将right添加进arr[]中
②判断right是否在arr[]中,在则将left也加入arr[]中
对arr排序(从小到大),输出
坑点: b值确定,c值不确定,经过赋值b=c后b的值也会变为不确定 -
第二个版本的思路(WA)
对26个小写字母列表,每次重新读入N时数组置0
每读入一行:
①判断:right为a,对a置1, 标记a已经作为确定值出现(之后当a被改变为不确定值以后,若再在right位置发现a不对其置1)
②将right的标记值(即right是否有值的状态)赋值给left
遍历字母数组,逐一输出确定值的变量,不存在确定值的变量则输出none
坑点: 有一种WA叫想太多
我之前认为只要a没有在赋值式子里面出现过,就不算他是有值的
实上哪怕你输入的是“1 b=c”,输出也是a!!!
不管a有没有在等式中出现,只要a不被一个不确定值的变量赋值,a的值就是恒确定的 -
第三个版本的思路(终于AC)
对26个小写字母列状态表(数组),每次重新读入N时数组置0,arr[0]=1
每读入一行,将right的状态(即right是否有值)赋给left
flag标记0
遍历字母数组,找到第一个状态为1的字母后,flag=字母的序号+1(只要存在状态为1的字母,flag在这部操作以后就不会是0)
判断:
如果flag==0(不存在确定值的变量),输出none
否则输出剩余确定值的字母
笔记
- b值确定,c值不确定,经过赋值b=c后b的值也会变为不确定
- a只要不被赋不确定的值,就恒确定,不管他出是否在等式里面出现
代码
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
int main(){
int arr[26];
int N, flag;
char left, right;
scanf("%d", &N);
getchar();
while(N != -1){
memset(arr, 0, sizeof(arr));
arr[0] = 1;
for(int i=0; i<N; i++){
scanf("%c=%c", &left, &right);
getchar();
arr[left-'a'] = arr[right-'a'];
}
flag = 0;
for(int i=0; i<26; i++){
if(arr[i]==1){
printf("%c", 'a'+i);
flag = i+1;
break;
}
}
if(flag==0)
printf("none");
else{
for(int i=flag; i<26; i++){
if(arr[i]==1)
printf(" %c", 'a'+i);
}
}
printf("\n");
scanf("%d", &N);
getchar();
}
return 0;
}