题目需要理解了才能很简单的做出来。
RE了好多次,才发现字符串结尾不是 ‘\n’ ,而是‘\0'。还是太渣了。
关键的是单词的编号:该位置的左边或者上面是边界或者是‘*’,则该位置是起点,也就是可以从这里开始向右或下读单词。
而且最后一组数据之后没有空行。
下面的是AC的代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <iomanip>
#include <algorithm>
using namespace std;
int num[15][15];
char str[15][15];
struct Data
{
int n;
char str[15];
};
Data map1[150], map2[150];
int cmp(Data x, Data y)
{
return x.n < y.n;
}
int main()
{
// freopen("232.txt", "r", stdin);
bool flag = false;
int a, c, r, i, j, count = 1;
while(cin >> c && c)
{
cin >> r;
for(i = 0; i < c; i++)
cin >> str[i];
memset(num, 0, sizeof(num));
int k = 1, l;
for(i = 0; i < c; i++) //找起点
{
for(j = 0; j < r; j++)
{
if(str[i][j] != '*' && (i - 1 < 0 || j - 1 < 0 || str[i - 1][j] == '*' || str[i][j - 1] == '*'))
num[i][j] = k++;
}
}
k = 0;
for(i = 0; i < c; i++) //横向
{
for(j = 0; j < r; )
{
if(str[i][j] != '*')
{
map1[k].n = num[i][j];
a = 0;
while(str[i][j] != '*' && j < r)
map1[k].str[a++] = str[i][j++];
map1[k++].str[a] = '\0';
}
j++;
}
}
l = 0;
for(i = 0; i < r; i++) //纵向
{
for(j = 0; j < c; )
{
if(str[j][i] != '*')
{
map2[l].n = num[j][i];
a = 0;
while(str[j][i] != '*' && j < c)
map2[l].str[a++] = str[j++][i];
map2[l++].str[a] = '\0';
}
j++;
}
}
sort(map1, map1 + k, cmp); //排序
sort(map2, map2 + l, cmp);
if(flag)
cout << endl;
flag = true;
cout << "puzzle #" << count++ << ':' << endl;
cout << "Across" << endl;
for(i = 0; i < k; i++)
{
cout << setw(3) << setfill(' ') << map1[i].n << '.';
cout << map1[i].str << endl;
}
cout << "Down" << endl;
for(i = 0; i < l; i++)
{
cout << setw(3) << setfill(' ') << map2[i].n << '.';
cout << map2[i].str << endl;
}
}
return 0;
}