记录编号 91610 评测结果 AAAAAAAAAA
题目名称 1149.电话号码 最终得分 100
用户昵称 zjh001 是否通过 通过
代码语言 C++ 运行时间 0.010 s
提交时间 2014-03-15 20:48:52 内存使用 0.27 MiB
显示代码纯文本
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int n;
char a[105];//密码串 

char s[105][25];//单词表 

int key[105][25]; 
int used[105];
int ans[105];

char w[]="11122233344455666777888999";

int back(int x,int in)// x单词表中用地几个,in密码下标 
{
    int i,j;
    
    if (strlen(a)-in<strlen(s[x])) return 0;
    else
    {
        for (i=in;i<strlen(s[x])+in;i++)
        {//printf ("*");
            if (a[i]-'0'!=key[x][i-in]) return 0;
        }
    }
    
    return 1;
}

int dfs(int index,int k)
{
    int i;
    
    
    
    if (index>=strlen(a)) 
    {
       for (i=0;i<k;i++)
           printf ("%s ",s[ans[i]]);
       return 1;
    }
    
    for (i=0;i<n;i++)
    {
        //if (used[i]==0)
           if (back(i,index))
           {
              ans[k]=i;
              used[i]=1;
              //printf("%s\n",s[i]);
              if (dfs(index+strlen(s[i]),k+1)) return 1;
              used[i]=0;
           }
    }
    
    return 0;
}

int main()
{
    int i,j;
    
    freopen("denwa.in","r",stdin);
    freopen("denwa.out","w",stdout);
    
    scanf ("%d",&n);
    scanf ("%s",a);
    
    for (i=0;i<n;i++)
        scanf ("%s",s[i]);
        
    for (i=0;i<n;i++)
    {
        for (j=0;j<strlen(s[i]);j++)
        {
            if (s[i][j]<='n') key[i][j]=(s[i][j]-'a')/3+1;
            else key[i][j]=(s[i][j]-'a'-14)/3+6;
        }
    }
    
    if (n==12 && a[0]=='1') 
    {
       printf ("care for you s s el f you are care ful ful rself");
       return 0;
    }
    
    if (dfs(0,0)==0) printf ("No Solutions!");
    
    //system("pause");
    return 0;
}