题目链接:点击打开链接
题目思路:先找出每一列相同的个数,然后根据排列组合原理去逐渐确定范围。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<sstream>
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 1e5;
int cnt[10];
char mp1[10][10];
char s[10][10];
char mp2[10][10];
int k;
int T;
int vis[26];
char ans[10];
int ok = 0;
void dfs(int now,int sum)
{
if(now>=5){
ok = 1;
return ;
}
int tmp = 1;
for(int i = now+1;i<5;i++){
tmp *= cnt[i];
}
int cntt = tmp;
for(int i = 0;i<cnt[now];i++){
if(tmp>=sum){
ans[now] = s[now][i];
dfs(now+1,sum);
break;
}
else{
sum-=tmp;
}
}
}
int main()
{
cout<<pow(16,16)<<endl;
scanf("%d",&T);
while(T--)
{
scanf("%d",&k);
for(int i = 0;i<6;i++){
scanf("%s",mp1[i]);
}
for(int i = 0;i<6;i++){
scanf("%s",mp2[i]);
}
for(int j =0;j<5;j++){
memset(vis,0,sizeof(vis));
int cntt = 0;
for(int i = 0;i<6;i++){
char tmp1 = mp1[i][j];
for(int ii = 0;ii<6;ii++){
if(tmp1 == mp2[ii][j]&&vis[(int)(tmp1-'A')]==0){
s[j][cntt++] = tmp1;
vis[tmp1-'A'] = 1;
}
}
}
// cout<<cntt<<endl;
cnt[j] = cntt;
}
int falg = 1;
int tmp = 1;
for(int i = 0;i<5;i++){
tmp*=cnt[i];
if(cnt[i]==0){
falg = 0;
}
}
if(!falg||k>tmp){
// cout<<"fuck"<<endl;
puts("NO");
}
else{
for(int i = 0;i<6;i++){
sort(s[i],s[i]+cnt[i]);
}
ok = 0;
dfs(0,k);
if(!ok)
puts("NO");
else{
cout<<ans<<endl;
}
}
}
}