ZOJ 3954 思維題
阿新 • • 發佈:2019-02-17
題意:已知七段燈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; }