• Vijos P1596 加法表【迭代】


    加法表

    背景

    神奇的加法表~

    描述

    著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字。
    例如:
    + L K V E
    L L K V E
    K K V E KL
    V V E KL KK
    E E KL KK KV

    其含义为:L+L=L,L+K=K,L+V=V,L+E=E,K+L=K,K+K=V,K+V=E,K+E=KL,……E+E=KV
    根据这些规则可推导出:L=0,K=1,V=2,E=3
    同时,可以确定该表表示的是4进制加法

    格式

    输入格式

    n(n<=11),表示行数,以下N行,n(n<=11),表示行数,以下N行,每行N个字符串,每个字符串间用空格隔开。(字符串中仅第一行有一个为"+"号,其他都由大写字母组成)

    输出格式

    第一行为各个字母表示什么数,格式如:L=0 K=1 …… (字符按第一行的输入顺序输出)
    第二行为加法运算是几进制的
    若不可能组成加法表,则应输出"Wrong!"

    样例1

    样例输入1

    5
    + L K V E
    L L K V E
    K K V E KL
    V V E KL KK
    E E KL KK KV
    

    样例输出1

    L=0 K=1 V=2 E=3
    4
    

    限制

    1s

    提示

    有多种神奇方法可以解决~
    注意检验!

    来源

    Noip 1998


    问题链接Vijos P1596 加法表

    问题分析:字母表示的加法表验证问题。

    程序说明

    用暴力法(或DFS)必然TLE。

    这里采用迭代法,样例程序可以通过,然而程序提交后WA,哪位帮忙解决一下!

    题记:(略)


    参考链接:(略)


    WA的C++程序如下:

    #include <iostream>
    #include <string>
    #include <map>
    
    using namespace std;
    
    const int N = 11;
    string s[N][N];
    int ans[N];
    int n, count;
    bool flag;
    
    map<char, int> o;
    
    int main()
    {
        cin >> n;
        for(int i=0; i<n; i++)
            for(int j=0; j<n; j++)
                cin >> s[i][j];
    
        for(int i=1; i<n; i++) {
            ans[i] = -1;
            o[s[0][i][0]] = i;
        }
    
        // 查找0,进位位1
        for(int i=1; i<n; i++) {
            if(s[i][i].length() == 1) {
                if(s[i][i] == s[0][i] ) {
                    ans[i] = 0;
                }
            } else if(s[i][i].length() == 2) {
                ans[o[s[i][i][0]]] = 1;
            }
        }
    
        // 4次迭代计算
        for(int k=1; k<=4; k++) {
            for(int i=1; i<n; i++)
                for(int j=1; j<n; j++)
                    if(ans[i] != -1 && ans[j] != -1) {
                        if(s[i][j].length() == 1) {
                            ans[o[s[i][j][0]]] = ans[i] + ans[j];
                        } else if(s[i][j].length() == 2) {
                            ans[o[s[i][j][1]]] = (ans[i] + ans[j]) % (n - 1);
                        }
                    }
        }
    
        // 输出结果
        for(int i=1; i<n; i++) {
            if(i != 1)
                cout << " ";
            cout << s[0][i] << "=" << ans[i];
        }
        cout << endl;
        cout << n - 1 << endl;
    
        return 0;
    }




  • 相关阅读:
    2016.11.9 小测试
    【noip】跟着洛谷刷noip题2
    【长沙集训】2017.10.10
    【noip】跟着洛谷刷noip题
    Oracle-函数-translate
    bit,byte,char,string区别与基本类型认识
    通俗地讲,Netty 能做什么?
    oracle判断一个字符串中是否包含另外一个字符串
    Oracle导入导出数据库(exp/imp和expdp/impdp的区别)
    同步异步以及阻塞和非阻塞的区别
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563612.html
Copyright © 2020-2023  润新知