《算法竞赛入门经典(第2版)》习题3-6纵横字谜的答案(Crossword Answers, UVa232)
这次不写批注了,debug通过但提交WA,两部分使用两种算法做的,可能需要重新写一下第一部分的算法,这就很难受了,不过后面还是得改的,毕竟经典题目。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
char aa[10][10];
char cc[10][10];
int bb[10][10];
const char*q="puzzle #";
const char*w="Across";
const char*e="Down";
int main()
{ int t=0;
while(1)
{ int r,c=0;
memset(cc,'\0',sizeof(cc));
scanf("%d",&r);
if(r==0) {break;}
scanf("%d",&c);
t++;if(t!=1)
{printf("\n");}printf("%s%d:\n",q,t);
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
{cc[i][j]='*';}
}
for(int i=0;i<r;i++)
{scanf("%s",aa[i]);}
int y=1;
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
{
if(aa[i][j]=='*') {bb[i][j]=0;}
else if(i==0||j==0){bb[i][j]=y;y++;}
if(i>0&&j>0&&aa[i][j]!='*'){bb[i][j]=-1;};
if(i>0&&j>0&&aa[i][j]!='*'&&(bb[i-1][j]==0||bb[i][j-1]==0)){bb[i][j]=y;y++;}
}
}
printf("%s",w);
if(!(r==1&&c==1&&aa[r-1][c-1]=='*')){printf("\n");}
for(int i=0;i<r;i++)
{ int first=1;int count=0;int con=0;int firstx=1;
for(int j=0;j<c;j++)
{ if(aa[i][j]=='*'){count=count+1;}
if(aa[i][j]!='*'){con=con+1;}
if(aa[i][j]!='*')
{if(first)
{ if(bb[i][j]<10) {printf(" %d.",bb[i][j]);}
if(bb[i][j]>=10) {printf(" %d.",bb[i][j]);}
first=0;
}
printf("%c",aa[i][j]);firstx=1;
}
if(aa[i][j]=='*'&&j!=0&&j!=c-1&&firstx&&aa[i][j-1]!='*'){printf("\n");firstx=0;first=1;}
if(i!=r-1&&con!=0&&count!=c&&j==c-1&&firstx)
{ int nn=0;
for(int l=0;l<c;l++)
{
if(aa[i+1][l]=='*'){nn=nn+1;}
}
if(nn!=c){printf("\n");}
}
}
}
printf("\n%s",e);if(!(r==1&&c==1&&aa[r-1][c-1]=='*')){printf("\n");}
int pp=0;int gg=1;
for(int i=0;i<r&≫i++)
{ int first=1;
for(int j=0;j<c&≫j++)
{
if(aa[i][j]!='*')
{
if(first)
{if(bb[i][j]<10)printf(" %d.",bb[i][j]);
if(bb[i][j]>=10)printf(" %d.",bb[i][j]);
first=0;
}
for(int k=i;k<r&≫k++)
{
if(aa[k][j]=='*')
{ pp=0;
for(int l=0;l<r;l++)
{
if(!strcmp(aa[l],cc[l])){pp=pp+1;}
else {pp=0;}
}
if(pp==r) {gg=0;}
if(pp!=r) {printf("\n");first=1;break;}
}
if(aa[k][j]!='*')
{printf("%c",aa[k][j]);aa[k][j]='*';pp=0;
for(int l=0;l<r;l++)
{
if(!strcmp(aa[l],cc[l])){pp=pp+1;}
else {pp=0;}
}
if(pp==r) {gg=0;}
if(k==r-1&&i!=r-1&&pp!=r){printf("\n");first=1;}}
}
}
if(aa[i][j]=='*') {continue;}
}
}
printf("\n");
}
return 0;
}