數碼管程式設計題-程式設計練習題(100)
阿新 • • 發佈:2018-12-16
目錄
問題:
7. |
【問題描述】 液晶數碼管用七筆阿拉數字表示的十個數字,把橫和豎的一 個短劃都稱為一筆,即7有3筆,8有7筆等。對於十個數字一種排列,要做到兩相鄰數字都可以由另一個數字加上幾筆或減去幾筆組成,但不能又加又減。比如 7→3是允許的,7→2不允許。任意輸入一組數,判斷是否符合上述規則,注意,1在右邊。 【輸入形式】 每行輸入一個0~9的排列,數字之間用空格分隔,以-1作為輸入結束 【輸出形式】 輸出YES或NO 【樣例輸入】
【樣例輸出】
|
分析:
方法1:可以把數碼管的七筆進行編號,然後使用二維數字儲存0-9十個數字所使用的數碼管編號,如果兩個數字編號交集等於其中一個數字的編號,則可以增幾筆或減幾筆變換,例如數字A用了編號1、3、5、7,數字B用了編號3、5,則=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; }
總結:
這道題不難,就是將對映表做出來花了點時間。仔細想想這道題也挺有意思。