Ancient Cipher

Ancient Cipher

 

 学习c++后可以用sort,该篇代码用的qsort

先了解一下qsort

Ancient Cipher

 

第一个参数是待排序的数组起始地址、第二个元素是元素个数,第三个元素是每个元素的大小,最后一个参数比较特别,是指向函数的指针

Ancient Cipher

 

const void *a是指向常数的万能指针,他可以通过强制类型转化变成任意类型的指针,然后把参数a和b转化为真实的数据,然后让cmp函数当a<b,a=b和a>b时返回负数、0、和正数即可

 

思路:

写在前排,该题替换不是凯撒密码!不是凯撒密码!不是凯撒密码!我看了很长时间终于理解题意,既然可以随便重排,那么我们可以直接找出两个字符串对应的字母的数量,都排序后,比较两个数组是否相同,如果相同说明可以通过替换让它们的字母一一对应,否则输出NO,题中替换的意思是,每个字母的所有项都改变为其他字母,但每个字母替代的字母不能相同,但有的字母可以是自己本身,注意每个字母都需要替换,只不过有的可能是替换为本身

代码如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int a[26], b[26];

int cmp(const void* a, const void* b)
{
    return *(int*)a - *(int*)b;
}

int main(void)
{
    char s[99], m[99];
    while (scanf("%s %s", s, m) == 2)
    {
        memset(a, 0, sizeof(a));
        memset(b, 0, sizeof(b));
        int y = strlen(s);
        for (int i = 0; i < y; i++)
        {
            a[s[i] - 'A']++;
            b[m[i] - 'A']++;
        }
        qsort(a, 26, sizeof(int), cmp);
        qsort(b, 26, sizeof(int), cmp);

        int q = 1;//用于记录数组是否相同
        for (int i = 0; i < 26; i++)
        {
            if (a[i] != b[i]) { printf("NO\n");  q = 0; break; }
        }
        if(q)
            printf("YES\n");
    }
    return 0;
}

 

上一篇:绿豆蛙的归宿


下一篇:【C】扫雷游戏 (getchar()用法)