Crossword Answer UVa232

Crossword Answer

这是一道比较基础的题目,放在《算法竞赛入门经典》第三章,主要是考了字符串和数组,有点需要基本功。
题目的意思是一个给定一个R*C的方格,上面有些有字母,有些是空的,然后要找出上面所有横向的和纵向的单词。单词要求必须从最边界开始或者从一个空格之后或者空格之下开始。
然后还有一个地方就是每个单词都要有序号,序号先列后行,但是输出的时候又要先输出行,所以每个列要记录起来,输完行了再输出了列,这样有点小麻烦,不过耐心一点也还好。
最后有一个注意的地方是输出,要严格的看清楚输出格式,这个很容易出错。输出要求每两个输出之间要有空行,序号还要占3列输出。
代码如下:
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
int r, c;
void getAcross(char cross[10][10], int i, int j)//直接输出横向上面的单词
{
	while (i < r && j < c && cross[i][j] != '*')
	{
		cout << cross[i][j];
		j++;
	}
	cout << endl;
}

void getDown(char cross[10][10],char line[1000][15], int i, int j, int x, int y)
{
	while (i < r && j < c && cross[i][j] != '*')//记录到line数组里面去
	{
		line[x][y] = cross[i][j];
		i++; y++;
	}
	line[x][y] = '\0';
}

int main()
{
	char cross[10][10],line[1000][15];//line数组用来存放碰到的列方向上的单词
	int i, j, ALL = 1;
	while (cin >> r, r)
	{
		cin >> c;
		getchar();
		for (i = 0; i < r; i++)
			cin >> cross[i];
		int num = 1,curX = 0, curY = 0; //curX,curY用来记录当前line数组的位置。
		if(ALL != 1) cout << endl;//如果是第一组,打印一个换行
		cout << "puzzle #" << ALL++ << ":" << endl;
		cout << "Across" << endl;
		for (i = 0; i < r; i++)
		{
			for (j = 0; j < c; j++)
			{
				if (cross[i][j] == '*') continue;
				bool log = 0;//判断当前位置是否构成单词,然后控制序号num的增加
				if ((j == 0 && cross[i][j] != '*') || (j != 0 && cross[i][j - 1] == '*'))//如果碰到横向的单词,直接输出
				{
					printf("%3d.",num);
					getAcross(cross, i, j);
					log = 1;
				}
				if ((i == 0 && cross[i][j] != '*') || (i != 0 && cross[i - 1][j] == '*'))//列向的单词,不输出,记录起来
				{
					line[curX][curY] = num + '0';
					getDown(cross, line, i, j, curX, curY+1);
					curX++; curY = 0;
					log = 1;
				}
				if(log) num++;
			}

		}
		cout << "Down" << endl;
		int temp;
		for (i = 0; i < curX; i++)//输出列方向上的单词
		{
			temp = line[i][0] - '0';
			printf("%3d.", temp);
			for (j = 1; line[i][j];j++)
				cout << line[i][j] ;
			cout << endl;
		}
		
		/*
		cout << endl;
		for (i = 0; i < r; i++)
			cout << cross[i] << endl;
		*/
	}

	//while (1) getchar();
	return 0;
}
/*
2 2
AT
*O
6 7
AIM*DEN
*ME*ONE
UPON*TO
SO*ERIN
*SA*OR*
IES*DEA
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值