模拟不解释。
源码
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char s[15][15];
int f[15][15];
int n,m;
struct N{
int num;
char s1[20];
}down[105];
bool cmp(N x,N y)
{
return x.num < y.num;
}
int main()
{
int kase = 1;
while(~scanf("%d",&n) && n)
{
scanf("%d",&m);
getchar();
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= m; ++j)
scanf("%c",&s[i][j]);
getchar(); //接受换行
}
memset(f,0,sizeof f);
int cnt = 1;
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= m; ++j)
{
if(s[i][j] != '*')
{
if(i == 1 || j == 1)
{
f[i][j] = cnt++;
}
else if(s[i - 1][j] == '*' || s[i][j - 1] == '*')
{
f[i][j] = cnt++;
}
}
}
}
if(kase != 1)
printf("\n");
printf("puzzle #%d:\n",kase++);
printf("Across\n");
for(int i = 1; i <= n; ++i)
{
int j = 1;
while(j <= m)
{
while(s[i][j] == '*' && j <= m ) ++j;
if(j <= m)
{
printf("%3d.",f[i][j]);
while(s[i][j] != '*' && j <= m)
{
printf("%c",s[i][j]);
++j;
}
printf("\n");
}
}
}
memset(down,0,sizeof(0));
int len = 0;
printf("Down\n");
for(int j = 1; j <= m; ++j)
{
int i = 1;
while(i <= n)
{
while(s[i][j] == '*' && i <= n) ++i;
if(i <= n)
{
down[len].num = f[i][j];
int len1 = 0;
while(s[i][j] != '*' && i <= n)
{
down[len].s1[len1++] = s[i][j];
++i;
}
down[len++].s1[len1] = '\0';
}
}
}
sort(down,down + len,cmp);
for(int i = 0;i < len;++i)
{
printf("%3d.%s\n",down[i].num,down[i].s1);
}
}
return 0;
}