1. 程式人生 > >數碼管程式設計題-程式設計練習題(100)

數碼管程式設計題-程式設計練習題(100)

目錄

問題:

分析:

總結:

問題:

7.

【問題描述】

液晶數碼管用七筆阿拉數字表示的十個數字,把橫和豎的一 個短劃都稱為一筆,即7有3筆,8有7筆等。對於十個數字一種排列,要做到兩相鄰數字都可以由另一個數字加上幾筆或減去幾筆組成,但不能又加又減。比如 7→3是允許的,7→2不允許。任意輸入一組數,判斷是否符合上述規則,注意,1在右邊。

【輸入形式】

每行輸入一個0~9的排列,數字之間用空格分隔,以-1作為輸入結束

【輸出形式】

輸出YES或NO

【樣例輸入】

4 1 0 7 3 9 5 6 8 2
3 5 1 6 2 7 9 0 4 8
-1

【樣例輸出】

YES
NO

分析:

方法1:可以把數碼管的七筆進行編號,然後使用二維數字儲存0-9十個數字所使用的數碼管編號,如果兩個數字編號交集等於其中一個數字的編號,則可以增幾筆或減幾筆變換,例如數字A用了編號1、3、5、7,數字B用了編號3、5,則A\cap B=B:{3、5}。所以這個變換是允許的。

方法2:方法1理論上可以實現,但是會比較麻煩,每兩個相鄰的數都要進行對比,也就是要迴圈7*(n-1)次,其中n為0-9一個排列中所含數的個數。所以我又想到了一個方法,將允許進行轉換的數字存入一個key-value對中,如果可以通過key找到對應的value(相鄰的數),則表示允許轉換,但是這個怎麼儲存呢?在map中key是不允許有重複的,但是我們可以使用multimap,這個函式操作就不細說了。這裡我使用另一種簡單的方法,使用一個二維陣列map_array[10][10],能相互轉換的數字對應位置存1,不允許相互轉換的存0。這樣就可以在O(1)的時間內檢視兩個數字是否允許轉換,相對於multimap來說就是造成了空間的浪費,但是相對於multimap來說陣列的速度是要快的。

C++AC程式碼:

#include <iostream>

using namespace std;

int main()
{                         //0 1 2 3 4 5 6 7 8 9  數字0-9互相轉換對映表,正好是對稱矩陣
    int map_array[10][10]={{1,1,0,0,0,0,0,1,1,0},  //0
                           {1,1,0,1,1,0,0,1,1,1},  //1
                           {0,0,1,0,0,0,0,0,1,0},  //2
                           {0,1,0,1,0,0,0,1,1,1},  //3
                           {0,1,0,0,1,0,0,0,1,1},  //4
                           {0,0,0,0,0,1,1,0,1,1},  //5
                           {0,0,0,0,0,1,1,0,1,0},  //6
                           {1,1,0,1,0,0,0,1,1,1},  //7
                           {1,1,1,1,1,1,1,1,1,1},  //8
                           {0,1,0,1,1,1,0,1,1,1}   //9
                          };
    int number[10];
    bool flag = true;

    while(1)
    {
        flag = true;
        cin >> number[0];
        if(-1 == number[0] )
        {
            break;
        }
        for(int i=1; i<10; i++)
        {
            cin >> number[i];                              //獲取數字存入number[]
            if(1 != map_array[ number[i-1] ][ number[i] ]) //判斷是否允許轉換
            {
                flag = false;
            }
        }
        if(false == flag)
        {
            cout << "NO" <<endl;
        }else{
            cout << "YES" <<endl;
        }
    }
    return 0;
}

總結:

這道題不難,就是將對映表做出來花了點時間。仔細想想這道題也挺有意思。