【NOIP 2009 提高组】潜伏者


这大概是这套题里中最简单的一道题了吧。(因为是第一题啊)。当然了,在网上看到了比我简短了很多的代码,效率也比我好。

废话少说

-------------------------------

在一开始读题的时候因为是要自己来确定密字,搞得我都准备问候家人了。读到后面发现这道题还是很简单的,就是纯的模拟题,没有什么算法可言(在我看来)。


分析:

就是一道纯模拟,直接看代码:

(因为是后面打的注释,所以可能会有点编译错误)

#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<map>
using namespace std;
struct Node{//定义的结构体
	char ar;//原文
	char mi;//密字
}t[101];
char a[101];//原文
char b[101];//密字
char c[101];//密码
char if_[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};//字母表,用来判断是不是已经找完了所有的字母。
 bool used[101]; //是不是已经找到了这个字母。
int main(){

	cin>>a;//输入不解释
	cin>>b;
	cin>>c;
	memset(used,false,sizeof(used));//初始化,false代表没有找到
	if(strlen(a)!=strlen(b)){//如果原文和密字的长度都不符合,直接就输出Failed了
		cout<<"Failed";
		//这里少了一个return 0;当然,好像不用考虑这种情况,所以这个判断要不要是一个样的
	}
	
	
	int idx=0;//结构体的下标
	for(int i=0;i<strlen(a);i++){//从原文来找
		for(int j=0;j<26;j++){//从字母表中来找
			if(a[i]==if_[j])//如果找到了
			{
				t[idx].ar=a[i];//储存原文
				t[idx].mi=b[i];//储存密字
				used[j]=true;//找到了
				idx++;//下一个
			}
		}
    }
		for(int i=0;i<26;i++){//如果有字母没有找到,直接输出Failed
			if(used[i]==false){
			cout<<"Failed";
		return 0;
			}
		}	
		for(int i=0;i<idx;i++){//开始匹配
			for(int j=i+1;j<idx;j++)//从找的后面一个开始匹配
			{//如果原文想等但密字不匹配或者密字相等原文不匹配,直接输出Failed
				if(i!=j&&(t[i].ar==t[j].ar&&t[i].mi!=t[j].mi)||(t[i].ar!=t[j].ar&&t[i].mi==t[j].mi)){
					cout<<"Failed";
					return 0;
				}
			}
		}
		for(int i=0;i<strlen(c);i++){//更改c的字母
			for(int j=0;j<idx;j++)
			{
				if(c[i]==t[j].ar){
				c[i]=t[j].mi;
				break;//重点,如果不加break的话会一直去更改,结果你绝对不想看到
				}
				
			}
		}
		for(int i=0;i<strlen(c);i++)
		cout<<c[i];//输出
	
}

洛谷题目

洛谷的测试结果:


猜你喜欢

转载自blog.csdn.net/qq_41734244/article/details/79781096