ZOJ - 3954 (模拟+思维)

题意:给你一个序列判断是否存在一种方案改成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;
}

猜你喜欢

转载自blog.csdn.net/a1325136367/article/details/79719664