题目: 给你一个二维的字符表,里面有一些字母和*,*和边界都当做是分隔符,
按照图示方式编号连续位置(从上到下,从左到右)生成单词,输出所有横向和竖向单词。
分析:字符串。先按照顺序求出每个方格的编号,除单词开头字母外,其他都是0;
然后,横向和总线扫描单词输出即可;(纵向的要先排序在输出)
说明:1.注意要按照顺序输出结果,2连续输出间有一个空行。
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
typedef struct _node
{
int id;
char str[12];
}node;
node data[101];
char maps[12][12];
int size[12][12];
int cmp(node a, node b)
{
return a.id < b.id;
}
int main()
{
int row,column,times = 1;
while (cin >> row && row) {
cin >> column;
for (int i = 0; i < row; ++ i)
cin >> maps[i];
int id = 1;
for (int i = 0; i < row; ++ i)
for (int j = 0; j < column; ++ j)
if (maps[i][j] != '*' && (!i || !j || maps[i-1][j] == '*' || maps[i][j-1] == '*'))
size[i][j] = id ++;
else size[i][j] = 0;
if (times > 1) printf("\n");
printf("puzzle #%d:\n",times ++);
printf("Across\n");
for (int i = 0; i < row; ++ i) {
int move = 0;
while (move < column) {
if (size[i][move]) {
printf("%3d.",size[i][move]);
int save = 0;
while (move < column && maps[i][move] != '*')
printf("%c",maps[i][move ++]);
printf("\n");
}else move ++;
}
}
printf("Down\n");
int count = 0;
for (int i = 0; i < column; ++ i) {
int move = 0;
while (move < row) {
if (size[move][i]) {
data[count].id = size[move][i];
int save = 0;
while (move < row && maps[move][i] != '*')
data[count].str[save ++] = maps[move ++][i];
data[count ++].str[save ++] = 0;
}else move ++;
}
}
sort(data, data+count, cmp);
for (int i = 0; i < count; ++ i)
printf("%3d.%s\n",data[i].id, data[i].str);
}
return 0;
}