NOI / 1.7编程基础之字符串 11:潜伏者

这个代码错哪了?
题目在http://noi.openjudge.cn/ch0107/11/


#include
#include
using namespace std;
int main(){
    char a[200],b[200],c[200];
    cin.getline(a,200);
    cin.getline(b,200);
    cin.getline(c,200);
    int i,m=strlen(a),l,w=strlen(c),e;
    for(i=0;ifor(l=0;lif(a[l]==a[i]&&b[l]!=b[i]){    //排除一个密码对应多个原文 
                cout<<"Failed";
                return 0;
            }
        }
    }
    for(i=0;ifor(l=0;lif(b[l]==b[i]&&a[l]!=a[i]){    //排除一个原文对应多个密码 
                cout<<"Failed";
                return 0;
            }
        }
    }
    for(i=0;ifor(l=0;l0;
            if(c[i]==a[l]){
                c[i]=b[l];    //如果c中字符==a中字符,将c的字符转换为b中字符
                e=1;
                break;
            }
        }
        if(e==0){
            cout<<"Failed";    //e用来排除原文不在已知密码中 
            return 0;
        }
    }
    for(i=0;i

你的代码没有判断A-Z是否都出现过。增加一个char flag[26]={0}来记录A-Z的字母在原文中是否都出现了,如果在原文中出现,就把对应的位设为1,转换完后遍历一次,检查是否有为0的即为False
代码修改如下:


#include<iostream>
#include<string.h>
using namespace std;
int main() {
    char a[200], b[200], c[200];
    char flag[26] = { 0 };
    cin.getline(a, 200);
    cin.getline(b, 200);
    cin.getline(c, 200);
    int i, m = strlen(a), l, w = strlen(c), e;
    for (i = 0; i < m; i++) {
        for (l = 0; l < m; l++) {
            if (a[l] == a[i] && b[l] != b[i]) {    //排除一个密码对应多个原文 
                cout << "Failed";
                return 0;
            }
        }
    }
    for (i = 0; i < m; i++) {
        flag[b[i] - 'A'] = 1; //将出现的字母位置设置为1
        for (l = 0; l < m; l++) {
            if (b[l] == b[i] && a[l] != a[i]) {    //排除一个原文对应多个密码 
                cout << "Failed";
                return 0;
            }
        }
    }
    for (i = 0; i < w; i++) {
        for (l = 0; l < m; l++) {
            e = 0;
            if (c[i] == a[l]) {
                c[i] = b[l];    //如果c中字符==a中字符,将c的字符转换为b中字符
                e = 1;
                
                break;
            }
        }
        if (e == 0) {
            cout << "Failed";    //e用来排除原文不在已知密码中 
            return 0;
        }
    }
    //判断字符是否都在原文中出现
    for (i = 0; i < 26; i++)
    {
        if (flag[i] == 0)
        {
            cout << "Failed";
            return 0;
        }
    }
    for (i = 0; i < w; i++) {
        cout << c[i];
    }
    return 0;
}


# include<bits/stdc++.h>
using namespace std;
char jm1[50];
char jm2[50];
char mw[110],yw[110];
char strmw[1000];
char stryw[1000];
int main(){
    while (~scanf("%s",mw)){
        scanf("%s",yw);
        scanf("%s",strmw);
        int slen = strlen(mw);
        memset(jm1,0,sizeof jm1);
        memset(jm2,0,sizeof jm2);
        bool ok = true;
        for (int i=0;i<slen;i++){
            if (jm1[yw[i]-'A']!=mw[i] && jm1[yw[i]-'A']!=0){
                ok = false;
                break;
            }
            jm1[yw[i]-'A'] = mw[i];
        }
        for (int i = 0 ;i<26 ;i++)
            if (jm1[i]==0)
                ok = false;
        for (int i=0;i<slen;i++){
            if (jm2[mw[i]-'A']!=yw[i] && jm2[mw[i]-'A']!=0){
                ok = false;
                break;
            }
            jm2[mw[i]-'A'] = yw[i];
        }
        if (ok){
            slen = strlen(strmw);
            for (int i=0 ;i<slen ;i++ ){
                if (jm2[strmw[i]-'A']==0){
                    ok = false;
                    break;
                }
                stryw[i] = jm2[strmw[i]-'A'];
            }
            stryw[slen]=0;
        }
        if (ok)
            printf("%s\n",stryw);
        else
            printf("Failed\n");
    }
                return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632