讨论 / PID326 智力游戏 只能过1个点,其他4个点输出乱码?还是执行错误?
drcool 2014-01-20 04:42:26
点我顶贴 收藏 删除
思路就是深搜,剔除长度没有出现的词,并把长度相同的词集中起来,便于搜索,不知哪里的问题?

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");

}

查看更多回复
提交回复