这也算是一道基础题吧,有些人可能会被这么长的一串文字描述给劝退,说实话,刘汝佳紫书里的例题开始会觉得很难,但了解多了算法之后,再回过头来看,也就是题目描述的吓人了一点的入门题。这题要先把每个开头字母给编号,一个字符组存字符,另一个数组存编号就可以解决了。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
using namespace std;
char a[15][15];
int ans[15][15];
int r, c;
void across() {
for (int i = 1; i <= r; i++) { //用“行”来循环
for (int j = 1; j <= c; j++) {
if ((j == 1 || a[i][j - 1] == '*') && a[i][j] != '*') { //判断是否要输出
printf("%3d.", ans[i][j]);
for (int k = j; k <= c; k++) { //输出Across
if (a[i][k] == '*') {
printf("\n"); break;
}
else printf("%c", a[i][k]);
if (k == c && a[i][k] != '*') printf("\n");
}
}
}
}
}
void down(){
for (int i = 1; i <= r; i++) {
for (int j = 1; j <= c; j++) {
if ((i == 1 || a[i - 1][j] == '*') && a[i][j] != '*') {
printf("%3d.", ans[i][j]);
for (int k = i; k <= r; k++) {
if (a[k][j] == '*') {
printf("\n"); break;
}
else printf("%c", a[k][j]);
if (k == r && a[k][j] != '*') printf("\n");
}
}
}
}
}
int main() {
int puzzle = 1;
bool flag = false;
while (scanf_s("%d", &r) && r) {
if (flag) cout << endl;
else flag = true;
int cnt = 1;
scanf_s("%d", &c);
memset(ans, 0, sizeof(ans));
for (int i = 1; i <= r; i++) {
getchar();
for (int j = 1; j <= c; j++) {
a[i][j] = getchar();
if ((i == 1 || j == 1 || a[i - 1][j] == '*' || a[i][j - 1] == '*') && a[i][j] != '*')
ans[i][j] = cnt++;
}
}
printf("puzzle #%d:\n", puzzle++);
cout << "Across" << endl;
across();
cout << "Down" << endl;
down();
}
return 0;
}