uva1262(编码与解码)

来源:互联网 发布:pdf.js 打开 word文档 编辑:程序博客网 时间:2024/06/05 04:27

题目大意:

给出两个6行5列的字母矩阵,找出满足如下条件的密码:密码中的每个字母在两个矩阵的对应列出现。现在找出字典序第k小的满足条件的密码.


题目分析:

因为数据量很小,所以可以采用暴力枚举的方法找到第k个答案。


代码:

#include <stack>#include <vector>#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;const int row=6;const int col=5;const int maxn=50;stack<char>out;stack<char>temp;vector<char>v[maxn];bool vis[maxn];bool visit[maxn][maxn]; ///第一个矩阵第j列有哪个字符void print(){    for(int i=1;i<=col;i++){        cout<<i<<":";        for(int j=0;j<(int)v[i].size();j++){            cout<<v[i][j]<<" ";        }        cout<<endl;    }}void print_ans(stack<char>out){    if(out.empty())    return;    char val=out.top();    out.pop();    print_ans(out);    cout<<val;}void dfs(int pos,int& num){    if(num<=0){        return;    }    if(pos==col+1){        num--;        if(num==0){            temp=out;            print_ans(temp);            cout<<endl;        }        return;    }    for(int i=pos;i<=col;i++){        for(int j=0;j<(int)v[i].size()&&!vis[i];j++){            vis[i]=1;            out.push(v[i][j]);            dfs(pos+1,num);            out.pop();            vis[i]=0;        }    }}int main(){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);    char ch;    int T,k;    cin>>T;    while(T--)    {        cin>>k;        while(!out.empty()) out.pop();        for(int i=1;i<=col;i++){            v[i].clear();        }        memset(visit,0,sizeof(visit));        for(int i=1;i<=row;i++){            for(int j=1;j<=col;j++){                cin>>ch;                visit[j][ch-'A']=true;            }        }        for(int i=1;i<=row;i++){            for(int j=1;j<=col;j++){                cin>>ch;                if(visit[j][ch-'A']){                    v[j].push_back(ch);                    visit[j][ch-'A']=false;                }            }        }        for(int i=1;i<=col;i++){            sort(v[i].begin(),v[i].end());        }        //print();        dfs(1,k);        if(k>0){            cout<<"NO"<<endl;        }    }    return 0;}


原创粉丝点击