【问题描述】
液晶数码管用七笔阿拉数字表示的十个数字,把横和竖的一 个短划都称为一笔,即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.首先,液晶数码管上的数字就是LED等显示的数字
2.由于系统自带的位运算符不能解决这么长的数的运算,于是我自己写函数来解决这个问题。
3.trans1将输入的数字转化为长度为7位的01字符串来表示各个数字;trans2来实现&位运算的操作
4.如果两个01串位运算之后的结果和其中一串相等,则符合题意;
#include<iostream>
#include<string>
using namespace std;
string trans1(int temp){
string res;
if(temp==0)
res="1110111";
else if(temp==1)
res="0010010";
else if(temp==2)
res="1011101";
else if(temp==3)
res="1011011";
else if(temp==4)
res="0111010";
else if(temp==5)
res="1101011";
else if(temp==6)
res="1101111";
else if(temp==7)
res="1010010";
else if(temp==8)
res="1111111";
else if(temp==9)
res="1111011";
return res;
}
string trans2(string str1,string str2){
string res="0000000";
for(int i=0;i<10;i++){
if(str1[i]=='1'&&str2[i]=='1')
res[i]='1';
else
res[i]='0';
}
return res;
}
int main(){
while(1){
int a[10];
for(int i=0;i<10;i++)
{
cin>>a[i];
if(a[0]==-1)
break;
}
if(a[0]==-1)
break;
string str[10];
for(int i=0;i<10;i++)
str[i]=trans1(a[i]);
int count=0;
for(int i=0;i<9;i++){
string temp=trans2(str[i],str[i+1]);
if(temp==str[i]||temp==str[i+1])
count++;
}
if(count==9)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}