习题3-6 纵横字谜的答案(Crossword Answers, ACM/ICPC World Finals 1994, UVa232)

题目描述:输入一个r行c列(1≤r,c≤10)的网格,黑格用“*”表示,每个白格都填有一个字母。如果一个白格的左边相邻位置或者上边相邻位置没有白格(可能是黑格,也可能出了网格边界),则称这个白格是一个起始格。首先把所有起始格按照从上到下、从左到右的顺序编号为1, 2, 3,…,接下来要找出所有横向单词(Across)。这些单词必须从一个起始格开始,向右延伸到一个黑格的左边或者整个网格的最右列。最后找出所有竖向单词(Down)。这些单词必须从一个起始格开始,向下延伸到一个黑格的上边或者整个网格的最下行。输入输出格式和样例请参考原题。

题目分析:首先要确定r,c的值,题目描述的应该只是输入网格(二维数组),没有包括行和列(为方便下面的代码直接输入了r,c),要求它们的值也很简单,可以直接初始化数组元素全为'0',然后用嵌套for循环判断即可。题目中引入了起始格的定义,所以要先找出所有的起始格,找也很简单,第一行第一列所有非'*'元素都是起始格,然后其他行列的元素用if判断左边和上面的元素(注意此处为‘其他’元素,也就是非第一行非第一列的元素,否则会溢出)。但问题在于找到之后怎么办?这里引入了另一个数组b[],首先初始化为0,方便后面判断,然后将a[]对应到b[],即将a在起始格所在的位置对应到b,将其赋值为1~n。准备完了接下来可以输出了,按行和按列输出字母是等价的,所以只看行就够了。对于每个起始格元素都要从左往右逐个输出字母&#x

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值