来自M78的光之文轩 2022-10-11 13:14 采纳率: 92%
浏览 134
已结题

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

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


#include<iostream>
#include<string.h>
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;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++){
        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<w;i++){
        cout<<c[i];
    } 
}
 
  • 写回答

3条回答 默认 最新

  • 关注

    你的代码没有判断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;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月13日
  • 已采纳回答 10月11日
  • 创建了问题 10月11日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改