#include<cstdio>
#include<iostream>
#include<cstring>
#include<stdlib.h>
using namespace std;
int n;
int mi[105],l,len,ans[105];
char m[105];
struct node{
char s[25];
int num[25];
int len,id;
}w[105];
void trans(node a[105],int k,int l){
for(int i=1;i<=l;i++){
char c=a[k].s[i];
int t;
if(c=='a'||c=='b'||c=='c')t=1;
if(c=='d'||c=='e'||c=='f')t=2;
if(c=='g'||c=='h'||c=='i')t=3;
if(c=='j'||c=='k'||c=='l')t=4;
if(c=='m'||c=='n')t=5;
if(c=='o'||c=='p'||c=='q')t=6;
if(c=='r'||c=='s'||c=='t')t=7;
if(c=='u'||c=='v'||c=='w')t=8;
if(c=='x'||c=='y'||c=='z')t=9;
a[k].num[i]=t;
}
}
void dfs(int k){
if(k>=l){
for(int i=1;i<=len;i++){
printf("%s",w[ans[i]].s+1);
if(i!=len)printf(" ");
}
// printf("\n");
// for(int i=1;i<=len;i++){
// printf("%d ",ans[i]);
// }
exit(0);
}
for(int i=1;i<=n;i++){
int flag=1;
for(int j=1;j<=w[i].len;j++){
if(mi[k+j]!=w[i].num[j]){
flag=0;
break;
}
}
if(flag){
ans[++len]=i;
// if(i==5)printf("check");
dfs(k+w[i].len);
//--len 看这里!!
ans[--len]=0;//看这里!!
}
}
}
int main(){
scanf("%d",&n);
scanf("%s",m+1);
l=strlen(m+1);
for(int i=1;i<=l;i++){
mi[i]=m[i]-'0';
}
for(int i=1;i<=n;i++){
scanf("%s",w[i].s+1);
w[i].len=strlen(w[i].s+1);
w[i].id=i;
trans(w,w[i].id,w[i].len);
}
dfs(0);
printf("No Solutions!");
return 0;
}
问题出在第56行:
ans[--len]=0;
这样写只有80pts
但是如果改成--len就AC
我觉得都没问题,因为++len的时候会把原来的盖掉。
有哪位大佬能解释一下吗?