1262 - Password (暴力枚举)

来源:互联网 发布:淘宝商品详情页多少钱 编辑:程序博客网 时间:2024/06/01 09:08

该题应该是用数学的组合知识做,不过因为密码格子很小,暴力枚举很快而且不容易做错 。

需要注意一点,因为每一列中可能有重复的字母,所以会出现重复的密码,因此要在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;}


1 0
原创粉丝点击