1. 程式人生 > >洛谷 1013 進位制

洛谷 1013 進位制

題目描述

著名科學家盧斯為了檢查學生對進位制的理解,他給出瞭如下的一張加法表,表中的字母代表數字。 例如:

+    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=LL+L=L,L+K=KL+K=K,L+V=VL+V=V,L+E=EL+E=E

K+L=KK+L=K,K+K=VK+K=V,K+V=EK+V=E,K+E=KLK+E=KL

…… E+E=KVE+E=KV

根據這些規則可推匯出:L=0L=0,K=1K=1,V=2V=2,E=3E=3

同時可以確定該表表示的是4進位制加法

//感謝lxylxy123456同學為本題新加一組資料

輸入輸出格式

輸入格式:

nn (n≤9)(n≤9)表示行數。

以下nn行,每行包括nn個字串,每個字串間用空格隔開。(字串僅有一個為‘+’號,其它都由大寫字母組成)

輸出格式:

① 各個字母表示什麼數,格式如:L=0L=0,K=1K=1,……按給出的字母順序。

② 加法運算是幾進位制的。

③ 若不可能組成加法表,則應輸出“ERROR!”

輸入輸出樣例

輸入樣例#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

題解:

字母的數量等於進位制的大小

判錯的時候,可以看一下那個表格右下角的一個等腰三角形,就會發現有一個由兩位數字(字母)組成的三角形。

我們驗算一下,對於L ,在該三角形的雙位字母中的個位中出現了三次,則4-1-3=0 ,L代表的就是零了,然後依次驗算n-1-次數,發現都等於實際上的進位制數字。

然後我們依舊可以發現,在L這一行裡面,沒有雙位字母出現,所以我們可以給L判0,依次查下去,就會發現,下一行,K有一個雙位字母,然後K是1,等等。

由上兩條作為判錯依據,用map對映來統計這些次數,會方便很多。

#include <iostream>
#include <map>
using namespace std;
map<char, int> a;
map<char, int> total;
char le[10];//letter
string x, y;
int main()
{
    int n, i, j;
    cin >> n;
    cin >> x;
    for (i = 1; i <= n - 1;i++) {
        cin >> x;
        le[i] = x[0];
    }//first line
    for (i = 1; i <= n - 1;i++) {//這是從第二行到第n-1行的意思
        for (j = 1; j <= n;j++) {
            cin >> x;
            if (x==y&&j!=1&&j!=2) {
                //第一列是鍵,第二列單列無法比較
                cout << "ERROR!";
                return 0;
            }
            y = x;
            if (x.size()==2) {
                a[x[1]]++;//計算該字母在兩位數個位上的個數,具體見表的右下角等腰三角形內
                total[le[i]]++;//第一行相當於第一列,計算該字母兩位數的個數
            }
        }
    }
    for (i = 1; i <= n-1;i++) {//對應著上面的1到n-1,這是n-1個字元的意思
        if (total[le[i]]!=n-2-a[le[i]]) {//字母總個數為n-1  
            cout << "ERROR!";
            return 0;
        }
    }
    for (i = 1; i <= n-1;i++) {
        cout << le[i] << '=' << total[le[i]]<<' ';
    }
    cout << endl
         << n - 1;
    getchar();
    getchar();
    return 0;
}