【问题描述】
液晶数码管用七笔阿拉数字表示的十个数字,把横和竖的一 个短划都称为一笔,即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
思路:利用map<int,string>,将数字与液晶数码管表示的数字联系起来。
例如我这里:(用一张图来表示)
图中标注的string中的位置,如果某位数字用了对应的位置,则string中的对应位置为1,反之为0.
如: (这就是以我的标记方法各数字所对应的字符)
m[0]="1110111";
m[1]="0010010";
m[2]="1011101";
m[3]="1011011";
m[4]="0111010";
m[5]="1101011";
m[6]="1101111";
m[7]="1010010";
m[8]="1111111";
m[9]="1111011";
再分析条件:“对于十个数字一种排列,要做到两相邻数字都可以由另一个数字加上几笔或减去几笔组成,但不能又加又减。比如 7→3是允许的,7→2不允许。”
这个条件详细请看代码中much和little的运用,不进行详细叙述。(注意一点:数字字符可以直接进行大小比较和加减)
#include<bits/stdc++.h>
using namespace std;//建议先了解一下什么是液晶数码管表示数字
map<int,string>m;//最简单的方法:模拟
void buildmap() {
m[0]="1110111";
m[1]="0010010";
m[2]="1011101";
m[3]="1011011";
m[4]="0111010";
m[5]="1101011";
m[6]="1101111";
m[7]="1010010";
m[8]="1111111";
m[9]="1111011";
}
int main() {
buildmap();
while(1) {
int arr[10];
for(int i=0; i<10; i++) {
cin>>arr[i];
if(arr[i]==-1)return 0;
}
int much;
int little;
int key=0;
for(int i=0; i<9; i++) {
much=0;
little=0;
for(int j=0; j<7; j++) {
if(m[arr[i]][j]>m[arr[i+1]][j])much++;
if(m[arr[i]][j]<m[arr[i+1]][j])little++;
}
if(much!=0&&little!=0){//两个均不为0,说明相邻的两个数字条件不符合
key=1;
}
}
if(key==0)
cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}