该题应该是用数学的组合知识做,不过因为密码格子很小,暴力枚举很快而且不容易做错 。
需要注意一点,因为每一列中可能有重复的字母,所以会出现重复的密码,因此要在dfs之前排序去重。
细节参见代码:
#include<bits/stdc++.h>
using namespace std;
int T,k,n,m,cnt;
char s1[10][10],s2[10][10],ans[10],len[10],a1[10][10],a2[10][10];
bool dfs(int cur) {
if(cur == 5) {
cnt++; ans[cur] = '\0';
if(cnt == k) { printf("%s\n",ans); return true; }
}
for(int i=0;i<len[cur];i++) {
bool ok = false;
for(int j=0;j<6;j++)
if(a2[cur][j] == a1[cur][i]) { ok = true; break; }
if(ok) {
ans[cur] = a1[cur][i];
if(dfs(cur+1)) return true;
}
}
return false;
}
int main() {
scanf("%d",&T);
while(T--) {
scanf("%d",&k);
for(int i=0;i<6;i++) scanf("%s",s1[i]);
for(int i=0;i<6;i++) scanf("%s",s2[i]);
for(int i=0;i<5;i++) {
for(int j=0;j<6;j++) {
a1[i][j] = s1[j][i];
a2[i][j] = s2[j][i];
}
}
for(int i=0;i<5;i++) {
sort(a1[i],a1[i]+6);
len[i] = unique(a1[i],a1[i]+6) - a1[i] ;
}
cnt = 0;
if(!dfs(0)) printf("NO\n");
}
return 0;
}