【FOJ】Problem 1055 赋值问题(WA到怀疑人生)

Problem 1055 赋值问题.

题意

求出含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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值