UVa232——Crossword Answers

题目需要理解了才能很简单的做出来。

RE了好多次,才发现字符串结尾不是 ‘\n’ ,而是‘\0'。还是太渣了。

关键的是单词的编号:该位置的左边或者上面是边界或者是‘*’,则该位置是起点,也就是可以从这里开始向右或下读单词。

而且最后一组数据之后没有空行。

下面的是AC的代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <iomanip>
#include <algorithm>
using namespace std;

int num[15][15];
char str[15][15];

struct Data
{
	int n;
	char str[15];
};

Data map1[150], map2[150];
int cmp(Data x, Data y)
{
	return x.n < y.n;
}
int main()
{
//	freopen("232.txt", "r", stdin);
	bool flag = false;
	int a, c, r, i, j, count = 1;
	while(cin >> c && c)
	{
		cin >> r;
		for(i = 0; i < c; i++)
			cin >> str[i];
		memset(num, 0, sizeof(num));
		int k = 1, l;
		for(i = 0; i < c; i++) //找起点
		{
			for(j = 0; j < r; j++)
			{
				if(str[i][j] != '*' && (i - 1 < 0 || j - 1 < 0 || str[i - 1][j] == '*' || str[i][j - 1] == '*'))
					num[i][j] = k++;
			}
		}
		k = 0;
		for(i = 0; i < c; i++) //横向
		{
			for(j = 0; j < r; )
			{
				if(str[i][j] != '*')
				{
					map1[k].n = num[i][j];
					a = 0;
					while(str[i][j] != '*' && j < r)
						map1[k].str[a++] = str[i][j++];
					map1[k++].str[a] = '\0';
				}
				j++;
			}
		}
		l = 0;
		for(i = 0; i < r; i++)  //纵向
		{
			for(j = 0; j < c; )
			{
				if(str[j][i] != '*')
				{
					map2[l].n = num[j][i];
					a = 0;
					while(str[j][i] != '*' && j < c)
						map2[l].str[a++] = str[j++][i];
					map2[l++].str[a] = '\0';
				}
				j++;
			}
		}
		sort(map1, map1 + k, cmp);  //排序
		sort(map2, map2 + l, cmp);
		if(flag)
			cout << endl;
		flag = true;
		cout << "puzzle #" << count++ << ':' << endl;
		cout << "Across" << endl;
		for(i = 0; i < k; i++)
		{
			cout << setw(3) << setfill(' ') << map1[i].n << '.';
			cout << map1[i].str << endl;
		}
		cout << "Down" << endl;
		for(i = 0; i < l; i++)
		{
			cout << setw(3) << setfill(' ') << map2[i].n << '.'; 
			cout << map2[i].str << endl;
		}
	}
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值