AC的同学看看,或者晒一下自己的代码吧
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct dic{
char c[20];
int len;
};
struct dic W[100000];
int v[100000];
struct sc{
int x,y, h,len;
};
struct sc T[15];
int n,num;
char map[500][500];
char jishu[500][500];
int ch[15];
int lenstart[22],lenend[22];
int lenhas[22];
int dfs(int deep)
{
int i,j,x,y,len,ret;
if(deep==n) return 1;
x=T[deep].x; y=T[deep].y; len=T[deep].len;
for(i=lenstart[len];i<lenend[len];i++)
{
if(v[i]) continue;
if(T[deep].h=='A')
{
for(j=0;j<len;j++)
{
if(map[y][x+j]&&(map[y][x+j]!=W[i].c[j])) break;
}
if(j==len)
{
for(j=0;j<len;j++)
{
if(!map[y][x+j]) map[y][x+j]=W[i].c[j];
jishu[y][x+j]++;
}
ch[deep]=i;
v[i]=1;
ret=dfs(deep+1);
if(ret) return ret;
v[i]=0;
for(j=0;j<len;j++)
{
jishu[y][x+j]--;
if(!jishu[y][x+j])
map[y][x+j]=0;
}
}
}
else
{
for(j=0;j<len;j++)
{
if(map[y+j][x]&&(map[y+j][x]!=W[i].c[j])) break;
}
if(j==len)
{
for(j=0;j<len;j++)
{
if(!map[y+j][x]) map[y+j][x]=W[i].c[j];
jishu[y+j][x]++;
}
ch[deep]=i;
v[i]=1;
ret=dfs(deep+1);
if(ret) return ret;
v[i]=0;
for(j=0;j<len;j++)
{
jishu[y+j][x]--;
if(!jishu[y+j][x])
map[y+j][x]=0;
}
}
}
}
return 0;
}
int compare( const void *arg1, const void *arg2 )
{
struct dic *A=arg1, *B=arg2;
return A->len-B->len;
}
int main()
{
int i,j,last,lend;
char x[24];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d %d %c %d",&T[i].x,&T[i].y,&T[i].h,&T[i].len);
lenhas[T[i].len]=1;
}
i=0; memset(x,0,sizeof(x));
while(EOF!=scanf("%s",x))
{
lend=strlen(x);
if(!lenhas[lend]) {memset(x,0,sizeof(x));continue;}
for(j=0;j<lend;j++) if(x[j]>='a') x[j]-=0x20;
memcpy(W[i].c,x,lend); W[i].len=lend; memset(x,0,sizeof(x));
i++;
}
num=i;
qsort(W,num,sizeof(struct dic),compare);
lenstart[W[0].len]=0; last=W[0].len;
for(i=1;i<num;i++)
{
if(W[i].len>last)
{
lenend[last]=i;
lenstart[W[i].len]=i;
last=W[i].len;
}
}
lenend[last]=num;
i=dfs(0);
if(i)
{
for(i=0;i<n;i++)
printf("%s\n",W[ch[i]].c);
}
else
printf("NO answer.\n");
}
