問題描述
七段碼顯示器是一種常見的顯示數字的電子元件,它由七個發光管組成:
圖依次展示了數字?0~9 用七段碼來顯示的狀態,其中燈管為黃色表示點亮,灰色表示熄滅。根據燈管的亮暗狀態,我們可以用一個狀態碼(狀態碼是一個?7?位的二進制數字)來表示一個七段碼,令燈管點亮時狀態為?1,燈管熄滅時狀態為?0,按照燈管 ABCDEFG 的順序標識一個七段碼,則數字?0~9 的狀態碼為:
數字 | 狀態碼 | 數字 | 狀態碼 |
---|---|---|---|
0 | 1111110 | 5 | 1011011 |
1 | 0110000 | 6 | 1011111 |
2 | 1101101 | 7 | 1110000 |
3 | 1111001 | 8 | 1111111 |
4 | 0110011 | 9 | 1111011 |
小藍有一個喜愛的數字,長度為?18?位,每一位用一個七段碼顯示器來展示 (每位只能是?0~9,可以包含前導零),由于燈管故障,一些本該點亮的燈管處于了熄滅狀態。例如,對于一個長度為?2?的數字來說,當兩個七段碼對應的狀態碼分別為:?1011111(高位)、1110011(低位)時,原本的數字可能會是:?68、69、88、89,有?4?種可能的值。
18?個七段碼顯示器對應的狀態碼分別為:
0000011
1001011
0000001
0100001
0101011
0110110
1111111
0010110
0101001
0010110
1011100
0100110
1010000
0010011
0001111
0101101
0110101
1101010
其中每行表示一個七段碼對應的的狀態碼(按照數字的高位到低位給出)。請你判斷下小藍喜愛的數字有多少種可能的值。
判斷每個殘缺的狀態碼能對應的數字個數,相乘
判斷一個殘缺的狀態碼對應的數字個數:
如果狀態碼的某一位是1,但數字的標準狀態碼是 0,則說明狀態碼不可能是這個數字
#include<iostream>
#include<string>
using namespace std;//數字 0~9 的狀態碼
char c[10][8]={"1111110","0110000","1101101","1111001","0110011","1011011","1011111","1110000","1111111","1111011"};
int ans = 1;int check(string s)
{int cnt = 0; //記錄可能對應的數字個數bool flag = 1;for(int i=0; i<=9; ++i) //遍歷數字0到9{flag = 1; //假設當前狀態碼能匹配到一個數字 for(int j=0; j<=6; ++j) //遍歷七段碼的每一位{if(s[j]=='1' && c[i][j]=='0'){//如果狀態碼 s的第 j位是 '1',但數字 i的標準狀態碼 l[i][j] 是 '0'//則說明狀態碼 s 不可能是數字 iflag = 0;break;}}if(flag) cnt++;}return cnt;
}int main()
{string s;for(int i=1; i<=18; ++i){cin>>s; ans *= check(s);}cout<<ans;return 0;
}