题意:给你一个序列判断是否存在一种方案改成a~g的顺序最后变成输入的序列
题解:我们可以根据题目给的01打个表,然后我们输入值得时候每一列的数用一个字符串保存下来,并且同时保存下来它应该对应的一列01字符,最后查看两段的01字符是否相等即可。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstdio>
#include<cmath>
#include<set>
#include<map>
#include<cstdlib>
#include<ctime>
#include<stack>
using namespace std;
#define mes(a) memset(a,0,sizeof(a))
#define rep(i,a,b) for(i = a; i <= b; i++)
#define dec(i,a,b) for(i = b; i >= a; i--)
#define fi first
#define se second
#define ls rt<<1
#define rs rt<<1|1
#define mid (L+R)/2
#define lson ls,L,mid
#define rson rs,mid+1,R
typedef double db;
typedef long long int ll;
typedef pair<int,int> pii;
typedef unsigned long long ull;
const int mx = 1e5+5;
const int x_move[] = {1,-1,0,0,1,1,-1,-1};
const int y_move[] = {0,0,1,-1,1,-1,1,-1};
int n,m;
char s[10][100] = {
"0000000",
"1001111",
"0010010",
"0000110",
"1001100",
"0100100",
"0100000",
"0001111",
"0000000",
"0000100"
};
int a[10];
char str[10][10];
char x[10][10],y[10];
map<string,int>mp;
bool check(){
for(int i = 0; i < 7; i++)
if(!mp[x[i]])
return false;
else
mp[x[i]]--;
return true;
}
int main(){
int t,q,ca = 1;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
mp.clear();
for(int i = 0; i < n; i++)
scanf("%d%s",&a[i],str[i]);
for(int i = 0; i < 7; i++){
for(int j = 0; j < n; j++)
x[i][j] = str[j][i],y[j] = s[a[j]][i];
y[n] = 0;
x[i][n] = 0;
mp[y]++;
}
check()?puts("YES"):puts("NO");
}
return 0;
}