这大概是这套题里中最简单的一道题了吧。(因为是第一题啊)。当然了,在网上看到了比我简短了很多的代码,效率也比我好。
废话少说
-------------------------------
在一开始读题的时候因为是要自己来确定密字,搞得我都准备问候家人了。读到后面发现这道题还是很简单的,就是纯的模拟题,没有什么算法可言(在我看来)。
分析:
就是一道纯模拟,直接看代码:
(因为是后面打的注释,所以可能会有点编译错误)
#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];//输出 }
洛谷的测试结果: