1. 程式人生 > >ZOJ 3954 思維題

ZOJ 3954 思維題

題意:已知七段燈abc...可以拼成1..9的所有的數字,(0代表燈亮,就是那種計算器的顯示法) 然後給你任意n個數字和他們的01排列每一列都是不同的燈管 問這些排列是否合法 思路:對於任意n個數,他們的abcdef的編碼(按列由上到下)是確定的,把這些編碼變成一個數 然後塞入map 再把標準的編碼塞入map2 看最後map map2是否相等
程式碼:
#include <iostream>
#include <cstdio>
#include <map>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 10;
int v[maxn][maxn];
int n;
void init()
{
    memset(v, 0, sizeof v);
    v[1][1] = v[1][3] = v[1][4] = v[1][6] = v[1][7] = 1;
    v[2][5] = v[2][6] = 1;
    v[3][3] = v[3][6] = 1;
    v[4][3] = v[4][4] = v[4][7] = 1;
    v[5][2] = v[5][3] = 1;
    v[6][2] = 1;
    v[7][1] = v[7][3] = v[7][4] = v[7][6] = 1;
    v[9][3] = 1;
}

int main()
{
    init();
    int Test;
    int num[maxn];
    char c[maxn][maxn];
    scanf("%d", &Test);
    while (Test--) {
        scanf("%d", &n);
        for (int i = 1; i <= n; ++i)
            scanf("%d%s", &num[i], c[i]);
        map<int, int> mp1, mp2;
        mp1.clear(); mp2.clear();
        for (int i = 1; i <= 7; ++i) {
            int temp1 = 0, temp2 = 0;
            for (int j = 1; j <= n; ++j) {
                temp1 = temp1 * 10 + c[j][i - 1] - '0';
                temp2 = temp2 * 10 + v[num[j]][i];
            }
            mp1[temp1]++;
            mp2[temp2]++;
        }
        if(mp1 == mp2) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}