ZOJ - 3954 Seven-Segment Display
题意:
一个七段显示器,由 a,b,c,d,e,f,g 七根显示管控制显示的数字。0代表开,1代表关。给你 n 个数字的显示状态,他们每一列对应的字母是否相同。(原序列对应a,b,c,d,e,f,g 可以打乱顺序) 相同输出YES,否则NO
例:
7 0101011 1 1101011
对应的序列为:a,g,b,f,c,e,d
题解:
因为可以随便交换 列,所以交换前后这一列所对应的值是不会改变的。所以我们可以以列作为标准检验是否存在。将原数字对应的列值 和 给定序列的列值作比较(map中自动排序),完全相同就存在
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<sstream>
#include<cstring>
#include<bitset>
#include<cstdio>
#include<string>
#include<deque>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#define mod 1000000007
using namespace std;
struct node
{
int k;
char s[11];
}q[10];
int v[10][10];
int main()
{
v[1][1] = v[1][4] = v[2][5] = v[2][6] = 1;
v[3][2] = v[4][1] = v[4][4] = v[4][7] = 1;
v[5][1] = v[5][3] = v[5][4] = v[5][5] = 1;
v[5][7] = v[5][9] = v[6][1] = v[6][2] = 1;
v[6][3] = v[6][7] = v[7][1] = v[7][7] = 1;
int t,n;
scanf("%d",&t);
while(t--)
{
map<int,int> mp1,mp2;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d %s",&q[i].k,q[i].s);
for(int i=0; i<7; i++) //计算列值
{
int ans1 = 0,ans2 = 0;
for(int j=0; j<n; j++)
{
ans1 = ans1*2+v[i+1][q[j].k];
ans2 = ans2*2+q[j].s[i]-'0';
}
mp1[ans1]++;
mp2[ans2]++;
}
if(mp1==mp2)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}