描述:液晶數碼管用七筆阿拉數字表示的十個數字,把橫和豎的一 個短劃都稱為一筆,即7有3筆,8有7筆等。對於十個數字一種排列,要做到
兩相鄰數字都可以由另一個數字加上幾筆或減去幾筆組成,但不能又加又減。比如 7→3是允許的,7→2不允許。任意輸入一組數,判斷是否符合上述規則。
輸入:每行輸入一個0~9的排列,數字之間用空格分隔,以-1作為輸入結束
輸出:輸入YES或NO
input:
4107395682 3 5 1 6 2 7 9 0 4 8 0
output:
YES NO
分析:有這樣一種思路,將每一筆表上順序,這樣每個數字就可以表示成一個字符串,如1為“35”,然後判斷相鄰兩個是否符合規則可以用較段數字的字符串是否為較大字符串的子集來判斷,如果是則符合
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 //判斷相鄰兩個是否可相互轉化 6 int s(string max, string min) 7 { 8 int n = 0; 9 for (int i=0; i < min.size(); i++) 10 { 11 for (int j = 0; j < max.size(); j++) 12 { 13 if (min[i] == max[j]) 14 n++; 15 } 16 } 17 if (n == min.size()) 18 return 1; 19 else 20 return 0; 21 } 22 23 //判斷函數 24 int cal(int a[]) 25 { 26 int k; 27 string b[10] = { "123567", "35", "23467", "23456", "1345", "12456", "124567", "235", "1234567", "123456" };//將數碼管中7話用數字1-7標記,用字符串存每個數字 28 //逐個比較a中相鄰兩個 29 for (int i = 0; i < 9; i++) 30 { 31 32 if (b[a[i]].size()>b[a[i + 1]].size()) 33 k = s(b[a[i]], b[a[i+1]]); 34 else 35 k = s(b[a[i+1]], b[a[i]]); 36 if (!k) 37 return 0; 38 } 39 return 1; 40 } 41 42 int main() 43 { 44 int a[10]; 45 while ((cin >> a[0]) && (a[0] != -1)) 46 { 47 for (int i = 1; i < 10; i++) 48 cin >> a[i]; 49 if (cal(a)) 50 cout << "Yes" << endl; 51 else 52 cout << "No" << endl; 53 } 54 system("pause"); 55 return 0; 56 }