数码管问题(c++实现)
描述:液晶数码管用七笔阿拉数字表示的十个数字,把横和竖的一 个短划都称为一笔,即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 }