UVa 232 - Crossword Answersa

题意:在一个有字母和*号组成的二维字符表中,按照从上到下、从左到右的顺序输出横向和纵向的单词,其中由*与二维字符表的边界作为单词之间的分隔标志,每个单词前都要有按照题意规定的每个字符在在表中的序号,且输出单词要按照序号顺序输出。

题解:可以用一个二维字符数组来存储字符,再用相同大小的整数数组来储存二维字符数组中各位置字符所在标号。输出纵向单词的时候要先将单词输出顺序进行排序(按照顺序扫描的话会出现更大序号单词先出现的情况)再输出。输出格式注意一下,输出样例之间有空行,结尾没空行。

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值