UVa 232 Crossword Answers

这道题读题的时候就出错了,
题目上要求的是先对要输出的每一个字母的头一个字母进行标号,
然后按标号的顺序依次进行输出单词

对于如何标号,可以将矩阵外边全部看成是黑色的,
如果说格子与的左边或者上边有黑色的,那么这个格子就是可以标号的,
标号的顺序就是从上往下,从左往右依次标号

我选择性忽略了这个条件,然后以为这道题是逐行输出单词、
逐列输出单词。

我先说一下我错误的代码是怎么实现的吧

先从行开始看,一开始如果第一个不是*,就正常往后一个一个输出字母,
遇到*了,就把它跳过去,然后对标号的变量加加操作,输出一个回车

但是需要注意的是,这个*必须是最后一个*才能进行这个操作,
如何进行这个操作?那几就需要在遇到*的时候看一下下一个格里的符号是不是*,
如果是*,那就跳过这个操作,继续看下一个符号,然后如果说下一个字符不是*,
那就变量加加操作,输出序号,输出回车

但是我发现我写的有点复杂,这有个问题,如果说有一列的末尾是连续的几个*,
最后一个*是要输出序号和回车的。
这显然是错的,因为这一列的*后面是没有字母的,那还输出序号,
下一列的开始要是字母那不就还要输出序号,这就多输出一个序号

解决的方法就是如果说最后个*,那就得判断这个*是不是在最后一行,
如果是最后一行,就不执行操作

然后对于正确的解法,我的思路是在读入的时候就对标号的空格进行标记表上对应的序号,
然后把这些标号的格存起来,输出的时候就找到这个各挨个输出方向是横向或方向是纵向的单词
遇到黑格就停止输出

然后下面是我写的错误思路的代码,中间的还有错误的地方

#include<iostream>
#include<stdio.h>
using namespace std;
int main(){
	char A[15][15];
	int r,l;
	int count=0;
	while(cin>>r){
		count++;
		if(r=='0'){
			break;
		}
		cin>>l;
		for(int i=1;i<=r;i++){
			for(int j=1;j<=l;j++){
				cin>>A[i][j];
			}
		}
		cout<<"puzzle #"<<count<<endl;
		cout<<"Across"<<endl;
		int cnt1=0;
		for(int i=1;i<=r;i++){
			if(i!=1&&A[i][1]!='*')
			cout<<endl;
			if(A[i][1]!='*'){
				cnt1++;
				printf("%3d.",cnt1);
				//cout<<A[i][1];
			}
			for(int j=1;j<=l;j++){
				if(A[i][j]!='*'){
				    cout<<A[i][j];	
				}
				//cout<<'!'<<endl;
				if(A[i][j]=='*'&&A[i][j+1]!='*'&&j<l){
					cout<<endl;
					cnt1++;
					printf("%3d.",cnt1);
					continue;
				}
				if(A[i][j]=='*'&&j!=1&&i==1){
					cout<<endl;
				}
				//cout<<A[i][j];
				if(A[i][j]=='*'&&A[i][j+1]=='*'){
					continue;
				}		
			}
		}
		cout<<endl;
		cout<<"Down"<<endl;
		int cnt2=0;
		for(int j=1;j<=l;j++){
			if(j!=1&&A[1][j]!='*')
			cout<<endl;
			if(A[1][j]!='*'){
				cnt2++;
				printf("%3d.",cnt2);
				//cout<<A[i][1];
			}
			for(int i=1;i<=r;i++){
				if(A[i][j]!='*'){
				    cout<<A[i][j];	
				}				//cout<<'!'<<endl;
				if(A[i][j]=='*'&&A[i+1][j]!='*'&&j<l){
					cout<<endl;
					cnt2++;
					printf("%3d.",cnt2);
					continue;
				}
				else if(i!=1&&A[i][j]=='*'&&A[i-1][j]!='*'){
					cout<<endl;
					cnt2++;
					printf("%3d.",cnt2);
					continue;
				} 
				else if(A[i][j]=='*'&&j!=1&&1==1){
					cout<<endl;
				}
				//cout<<A[i][j];
				else if(A[i][j]=='*'&&A[i+1][j]=='*'){
					continue;
				}		
			}
		}
	}
}

/*
2 2
AT
*O
6 7
AIM*DEN
*ME*ONE
UPON*TO
SO*ERIN
*SA*OR*
IES*DEA
0
*/

横着输出是没什么明显的错误,但纵着输出就有很大的问题 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值