Crossword Answers
Time Limit: Unknown Memory Limit: Unknown
Total Submission(s): Unknown Accepted Submission(s): Unknown
https://uva.onlinejudge.org/i...
Accepted Code
// Author : Weihao Long
// Created : 2017/12/21
#include "stdio.h"
struct node {
char c;
int no;
};
int is_alp(char c) {
return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z');
}
int main() {
int r, c, flag = 1;
while (scanf("%d", &r) != EOF) {
if (!r)
break;
scanf("%d", &c);
getchar();
node a[12][12];
int count = 1;
for (int i = 1; i <= r; i++) {
for (int k = 1; k <= c; k++) {
scanf("%c", &a[i][k].c);
a[i][k].no = 0;
if (is_alp(a[i][k].c) && (i == 1 || k == 1 || !is_alp(a[i - 1][k].c) || !is_alp(a[i][k - 1].c)))
a[i][k].no = count++;
}
getchar();
}
if (flag != 1)
printf("\n");
printf("puzzle #%d:\n", flag++);
printf("Across\n");
for (int i = 1; i <= r; i++) {
for (int k = 1; k <= c; k++) {
if (is_alp(a[i][k].c)) {
printf("%3d.", a[i][k].no);
for (; k <= c && a[i][k].c != '*'; k++) {
printf("%c", a[i][k].c);
}
printf("\n");
}
}
}
printf("Down\n");
for (int i = 1; i <= r; i++) {
for (int k = 1; k <= c; k++) {
if (a[i][k].no > 0 && is_alp(a[i][k].c)) {
printf("%3d.", a[i][k].no);
for (int ii = i; ii <= r && a[ii][k].c != '*'; ii++) {
printf("%c", a[ii][k].c);
a[ii][k].no = 0;
}
printf("\n");
}
}
}
}
return 0;
}
Notes
题意:
输入一个 r 行 c 列的网格,黑格用“*”表示,每个白格都填有一个字母。如果一个白格的左边相邻位置或者上面相邻位置没有白格(可能是黑格,也可能出了网格边界),则称这个白格是一个起始格。
首先把所有起始格按照从上到下、从左到右的顺序编号为 1,2,3,... ,如图所示。
接下来要找出所有的横向单词(Across)。这些单词必须从一个起始格开始,向右延伸到一个黑格的左边或者整个网格的最右列。
最后找出所有的竖向单词(Down)。这些单词必须从一个起始格开始,向下延伸到一个黑格的上边或者整个网格的最下行。
思路:
定义包含一个字符型和一个整型的结构,同时描述一个格子的字母和编号。然后按要求操作即可。
算法:
第一步:录入数据同时判断是否为起始格,若是就对它编号。
第二步:输出横向单词:从编号小的格子开始横向输出,直到遇到黑格或边界为止。若是遇到黑格,则从黑格后继续。
第三步:输出纵向单词:从编号小的格子开始纵向输出,直到遇到黑格或边界为止。(鉴于扫描的机制,在竖向输出的同时要把输出过的格子的编号置为 '0',以免输出子串)
感受:
注意题目要求的输出格式。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。