ZOJ - 3954 Seven-Segment Display 思维

40 篇文章 0 订阅

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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值