zoukankan      html  css  js  c++  java
  • CODE FESTIVAL 2017 qual A C Palindromic Matrix(补题)

    彩笔看到题目后,除了懵逼,没有啥反应了,唯一想的就是 这是不是dp啊?看了题解才发现,原来是这样啊。
    画几个矩阵看看就能看出来规律。

    思路:先假设这是个M * N的矩阵

    • 如果M和N都是偶数,则每个出现的字母的个数都必须是偶数个,如果有某个字母出现奇数个的话,肯定不会对称,因为M和N都是偶数,所以每个字母肯定出现次数是4的倍数。假设右上角是字母a,则另外三个角肯定也是a,所以至少4个,里面的字母也是这样。
    • 如果M和N一个奇数,一个偶数,则字母出现的次数,是2的倍数或者4的倍数。假设矩阵高度为奇数,宽度为偶数,则除了中间的那一行只是左右对称的之外,其余行的字母都是要保证左右对称和上下对称。都要至少4个,中间那一行左右对称,至少两个。
    • 如果M和N都是奇数,则除了中间行和中间列之外,都要保证上下左右对称,中间行保证左右对称,中间列上下对称,最后中间再剩下一个字母。这就是要求,去掉中间那个字母,构造出来周围的那些位置且保证对称后,最后要再留一个字母放中间,哪个字母就无所谓了。

    然后就是看输入的字母矩阵能否构成上述矩阵。
    官方题解有过程。

    #include <bits/stdc++.h>
    using namespace std;
    int rec[26];
    int main()
    {
        int H,W;
        scanf("%d %d",&H,&W);
        int two = 0,four = 0,one = 0;
        for(int i = 0; i < H/2; ++i)
            for(int j = 0; j < W/2; ++j)
                ++four;
     
        if(H&1 && W&1)
            two = two + H/2 + W/2;
        else if(H&1)
            two += W/2;
        else if(W&1)
            two += H/2;
     
        if(H&1 && W&1)
            one = 1;
        char ch;
        for(int i = 0; i < H; ++i)
        {
            for(int j = 0; j < W; ++j)
            {
                scanf(" %c",&ch);
                rec[ch-'a']++;
            }
        }
     
        for(int i = 0; i < 26; ++i)
        {
            while(rec[i] >= 4 && four > 0)
            {
                rec[i] -= 4;
                four--;
            }
        }
        if(four != 0)
        {
            printf("No
    ");
            return 0;
        }
        for(int i = 0; i < 26; ++i)
        {
            while(rec[i] >= 2 && two > 0)
            {
                rec[i] -= 2;
                two--;
            }
        }
        if(two != 0)
        {
            printf("No
    ");
            return 0;
        }
     
        int sum = accumulate(rec,rec+26,0);
        if(H&1 && W&1 && sum == 1)
            printf("Yes
    ");
        else if(H&1 && W&1 && sum != 1)
            printf("No
    ");
        else if(sum == 0)
            printf("Yes
    ");
        else
            printf("No
    ");
        return 0;
    }
    
  • 相关阅读:
    结对-五子棋游戏-开发过程
    团队-象棋游戏-设计文档
    课后作业-阅读任务-阅读提问-4
    团队-及格成绩查询系统-项目总结
    11.29-构建之法:现代软件工程-阅读笔记
    软件工程课程总结
    团队-及格成绩查询系统-最终程序
    团队-象棋游戏-团队一阶段互评
    课后作业-阅读任务-阅读提问-3
    课后作业-阅读任务-阅读笔记-3
  • 原文地址:https://www.cnblogs.com/guoyongheng/p/7592442.html
Copyright © 2011-2022 走看看