算法竞赛入门经典第二版课后习题 3-6 纵横字谜的答案
跟自己打赌写完这道题就去吃饭,结果现在要饿死啦,几处难以发现的细节老是出错QAQ
没有按照题目的意思给起始格编号,而是建了一个新的二维数组记录起始格的位置。
平常偶尔会翻翻这本书后面的内容,虽然后面的内容不会,还是觉得这种想法可以用后面的某种数据结构更好的做出来?
也许吧。不过以目前自己的水平只能写成这个样子了
输出纵向和横向单词分别用了两次for循环,感觉好麻烦,还好我不去过OJ。。。
# include <iostream>
# include <cstring>
using namespace std;
int main()
{
int r,c;//r行c列
cin>>r>>c;
char Map[r][c];
//输入网格
for(int i = 0; i < r; i++)
{
for(int j = 0; j < c; j++)
{
cin>>Map[i][j];
}
}
//寻找起始格
char AND[r][c];
memset(AND,'\0',sizeof(AND));
for(int i = 0; i < c; i++)
{
for(int j = 0; j < r; j++)
{
if(Map[j][i] != '*')
{
if(i == 0 || Map[j][i-1] == '*')//横向起始格
{
AND[j][i] = 'A';
}
if(j == 0 || Map[j-1][i] == '*')
{
if(AND[j][i] == 'A')
AND[j][i] = 'C';//纵向和横向
else
AND[j][i] = 'B';//纵向起始格
}
}
}
}
//输出横向单词
cout<<"Across: \n";
for(int i = 0; i < c; i++)
{
for(int j = 0; j < r; j++)
{
if(AND[j][i] == 'A' || AND[j][i] == 'C')
{
cout<<Map[j][i];
int t = 1;
while(Map[j][i+t]!='*' && t < c-i)
{
cout<<Map[j][i+t];
t++;
}
cout<<endl;
}
}
}
cout<<"\n\n";
//输出纵向
cout<<"Down: \n";
for(int i = 0; i < c; i++)
{
for(int j = 0; j < r; j++)
{
if(AND[j][i] == 'B' || AND[j][i] == 'C')
{
cout<<Map[j][i];
int t = 1;
while(Map[j+t][i]!='*' && t < r-j)
{
cout<<Map[j+t][i];
t++;
}
cout<<endl;
}
}
}
return 0;
}
今天下午P大为剧版镇魂写的番外出来了,很好的为脑残编剧填了坑。这个夏天也快要结束了
感谢这个夏天的镇魂,认识了居老师和白宇哥哥
希望自己也能成为一个像居老师一样温柔坚定的人,每天都可以像白宇哥哥一样开心,也可以给旁边的人带去快乐
好好学习好好敲代码呀
毕竟敲代码这么有意思,虽然自己挺笨的学不会太多东西
去吃饭咯