题意:在一个有字母和*号组成的二维字符表中,按照从上到下、从左到右的顺序输出横向和纵向的单词,其中由*与二维字符表的边界作为单词之间的分隔标志,每个单词前都要有按照题意规定的每个字符在在表中的序号,且输出单词要按照序号顺序输出。
题解:可以用一个二维字符数组来存储字符,再用相同大小的整数数组来储存二维字符数组中各位置字符所在标号。输出纵向单词的时候要先将单词输出顺序进行排序(按照顺序扫描的话会出现更大序号单词先出现的情况)再输出。输出格式注意一下,输出样例之间有空行,结尾没空行。
#include<cstdio>
#include<string.h>
#include<stdlib.h>
#define MAX 20
int main()
{
int r, c;
int count = 1;//统计输出样例个数
int cal;//序号
char init[MAX][MAX];//保存字符的数组
int num[MAX][MAX];//保存矩阵中字符的序号
int judge=0;
scanf("%d", &r);
while(r!=0)
{
cal=1;
scanf("%d", &c);
memset(init, 0, sizeof(init));
memset(init, 0, sizeof(num));
fflush(stdin);
for(int i=0; i<r; i++)
{
scanf("%s", init[i]);
}
for(int i=0; i<r; i++)
{
for(int j=0; j<c; j++)
{
if((i==0 || j==0 || init[i-1][j]=='*' || init[i][j-1]=='*')&&init[i][j]!='*')
{
num[i][j]=cal;
cal++;
}
}
}
printf("puzzle #%d:\n", count++);
printf("Across\n");
for(int i=0; i<r; i++)
{
for(int j=0; j<c; j++)
{
if((j==0 || init[i][j-1]=='*') && init[i][j]!='*')
{
printf("%3d.%c", num[i][j], init[i][j]);//注意输出是%3d
judge=0;
continue;
}
if((init[i][j]=='*'))
{
if(judge!=1)
{
printf("\n");
judge=1;
}
continue;
}
printf("%c", init[i][j]);
}
if(judge==0)
{
printf("\n");
judge=1;
}
}
printf("Down\n");
for(int i=0; i<r; i++)
{
for(int j=0; j<c; j++)
{
if((init[i-1][j]=='*' || i==0 ) && init[i][j]!='*')
{
num[i][j]*=100;//按顺序将要输出的那些序号重新排序
}
}
}
for(int i=0; i<r; i++)
{
for(int j=0; j<c; j++)
{
if(num[i][j]>=100)
{
printf("%3d.%c", num[i][j]/100, init[i][j]);
for(int k=i+1; k<r&&init[k][j]!='*'; k++)
{
printf("%c", init[k][j]);
}
printf("\n");
}
}
}
scanf("%d", &r);
if(r!=0)
printf("\n");
}
return 0;
}