回 帖 发 新 帖 刷新版面

主题:填字游戏的一个答案

2002年icpc决赛题!

就是在chinadaily上有的crossword!本程序采用了递归法,大家可以在turboc中试一下,
下面的N,M,K,L可根据须要改动!输入不能填词的位置的坐标,以(100,0)结束,再输入各个单词即可。
#define N 4/*hang*/
#define M 5/*lie*/
#define K 8/*changdu*/
#define L 10/*shuliang*/
int p4=0;

work(int i,char a3[N+2][M+2],char word[L][K],int wl[],int ax[N+2][M+2],int ay[N+2][M+2])
{char a[N+2][M+2];
int w,i1,j,p,q,p1,q1;

if(p4==1)
   return 10;
if(i==L)
   {
   for(i1=0;i1<N+1;i1++)
   {for(w=0;w<M+1;w++)
    printf("%2c",a3[i1][w]);
    printf("\n");
    }p4=1;
    return 10;
    }

for(p=1;p<N+1;p++)
for(q=1;q<M+1;q++)
{
if(a3[p][q]=='*')
goto point;
if(ax[p][q]==wl[i])
   {

   for(q1=q;q1<q+wl[i];q1++)
      if(a3[p][q1]!='\0'&&a3[p][q1]!=word[i][q1-q])
 goto point1;

  for(i1=0;i1<N+2;i1++)
      for(w=0;w<M+2;w++)
 a[i1][w]=a3[i1][w]; /*beifen*/

  for(q1=q;q1<q+wl[i];q1++)
      a[p][q1]=word[i][q1-q];/*fuzhi*/
      if(p4==1)return 10;
      for(i1=1;i1<N+1;i1++)
{
for(w=1;w<M+1;w++)
printf("%c ",a[i1][w]);
printf("\n");

      }


work(i+1,a,word,wl,ax,ay);
    }
point1:;
if(ay[p][q]==wl[i])
  {
  for(p1=p;p1<p+wl[i];p1++)
      if(a3[p1][q]!='\0'&&a3[p1][q]!=word[i][p1-p])
goto point;
      for(i1=0;i1<N+2;i1++)
      for(w=0;w<M+2;w++)
 a[i1][w]=a3[i1][w];/*beifen*/

  for(p1=p;p1<p+wl[i];p1++)
a[p1][q]=word[i][p1-p];/*fuzhi*/
      if(p4==1)return 10;
      for(i1=1;i1<N+1;i1++)
{
for(w=1;w<M+1;w++)
printf("%c ",a[i1][w]);
printf("\n");
}

work(i+1,a,word,wl,ax,ay);


}
point:;
}
}
main()
{char a[N+2][M+2]={'\0'};
int ax[N+2][M+2]={0},ay[N+2][M+2]={0};
char word[L][K]={'\0'};
int wl[L];
int i,j,p,q,K1;

for(i=0;i<N+2;i++)
{a[i][0]=a[i][M+1]='*';
ax[i][0]=ax[i][M+1]=ay[i][0]=ay[i][M+1]=-1;}

for(i=0;i<M+2;i++)
{a[0][i]=a[N+1][i]='*';
ax[0][i]=ax[N+1][i]=ay[0][i]=ay[N+1][i]=-1;}

do
{
scanf("%d,%d",&p,&q);
if(p==100)
goto end;
a[p][q]='*';
ax[p][q]=ay[p][q]=-1;
end:;
}
while(p!=100);

for(i=1;i<N+1;i++)
for(j=1;j<M+1;j++)
{if(ax[i][j]==-1)
continue;
ax[i][j]=1;


for(K1=j;K1<M+1&&a[i][K1+1]!='*';K1++)
ax[i][j]++;}


for(j=1;j<M+1;j++)
for(i=1;i<N+1;i++)
{if(ay[i][j]==-1)
continue;
ay[i][j]=1;

for(K1=i;K1<N+1&&a[K1+1][j]!='*';K1++)
    ay[i][j]++;}

for(i=1;i<N+1;i++)
for(j=1;j<M+1;j++)
{if(a[i][j]=='*')
continue;
if(a[i][j-1]!='*')
ax[i][j]=0;
if(a[i-1][j]!='*')
ay[i][j]=0;}


for(i=1;i<N+1;i++)
{for(j=1;j<M+1;j++)
printf("%3d ",ax[i][j]);
printf("\n");}
for(i=1;i<N+1;i++)
{for(j=1;j<M+1;j++)
printf("%3d ",ay[i][j]);
printf("\n");}

for(i=0;i<L;i++)
{scanf("%s",&word[i]);
    wl[i]=strlen(word[i]);
printf("%d",wl[i]);
}



for(i=0;i<L;i++)
printf("%s   ",word[i]);

work(0,a,word,wl,ax,ay);

}
}是不是很长?好好研究吧!

回复列表 (共6个回复)

沙发

好长,,晕的不行!!!呵。。

板凳

加注释!

3 楼

这么长的程序写在上面,太不负责了吧
至少应该加注释

4 楼

没有注释的程序,写他的人再行也是菜B~~!

写好释的程序才算是入了门的合格程序员

5 楼

楼主再怎么说也花了心思,大家可以自己去试啊!!程序是编出来的,不是看不出来的!

6 楼

程序是给用户或其他人看的
一个好的程序员应该养成加注释的习惯
你们说不是吗
我想这些老师都讲过吧

我来回复

您尚未登录,请登录后再回复。点此登录或注册