这道题读题的时候就出错了,
题目上要求的是先对要输出的每一个字母的头一个字母进行标号,
然后按标号的顺序依次进行输出单词
对于如何标号,可以将矩阵外边全部看成是黑色的,
如果说格子与的左边或者上边有黑色的,那么这个格子就是可以标号的,
标号的顺序就是从上往下,从左往右依次标号
我选择性忽略了这个条件,然后以为这道题是逐行输出单词、
逐列输出单词。
我先说一下我错误的代码是怎么实现的吧
先从行开始看,一开始如果第一个不是*,就正常往后一个一个输出字母,
遇到*了,就把它跳过去,然后对标号的变量加加操作,输出一个回车
但是需要注意的是,这个*必须是最后一个*才能进行这个操作,
如何进行这个操作?那几就需要在遇到*的时候看一下下一个格里的符号是不是*,
如果是*,那就跳过这个操作,继续看下一个符号,然后如果说下一个字符不是*,
那就变量加加操作,输出序号,输出回车
但是我发现我写的有点复杂,这有个问题,如果说有一列的末尾是连续的几个*,
最后一个*是要输出序号和回车的。
这显然是错的,因为这一列的*后面是没有字母的,那还输出序号,
下一列的开始要是字母那不就还要输出序号,这就多输出一个序号
解决的方法就是如果说最后个*,那就得判断这个*是不是在最后一行,
如果是最后一行,就不执行操作
然后对于正确的解法,我的思路是在读入的时候就对标号的空格进行标记表上对应的序号,
然后把这些标号的格存起来,输出的时候就找到这个各挨个输出方向是横向或方向是纵向的单词
遇到黑格就停止输出
然后下面是我写的错误思路的代码,中间的还有错误的地方
#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
*/
横着输出是没什么明显的错误,但纵着输出就有很大的问题