主题:填字游戏的一个答案
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);
}
}是不是很长?好好研究吧!
就是在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);
}
}是不是很长?好好研究吧!