这道题难道是不难,细节太多了,撸了一百多行,PE?还好及时发现。。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<cmath>
using namespace std;
struct node
{
int nu;
char c[15];
}b[205];
bool cmp(node a, node b)
{
return a.nu < b.nu;
}
int main()
{
char a[15][15];
int num[15][15];
int m, n;
int cas = 0;
while(scanf("%d",&n) != EOF)
{
if(n == 0) break;
scanf("%d",&m);
memset(num, 0, sizeof(num));
if(cas) printf("\n");
printf("puzzle #%d:\n",++cas);
for(int i = 0; i < n; i ++)
for(int j = 0; j < m; j ++)
cin>>a[i][j];
int cnt = 0;
for(int i = 0; i < n; i ++)
for(int j = 0; j < m; j ++)
{
if((i == 0 || j == 0 || a[i][j-1] == '*' || a[i-1][j] == '*' )&& a[i][j] != '*')
num[i][j] = ++ cnt;
}
// for(int i = 0; i < n; i ++)
// {
// for(int j = 0; j < m; j ++)
// {
// cout<<num[i][j]<<' ';
// }
// cout<<endl;
// }
printf("Across\n");
for(int i = 0; i < n; i ++)
{
int first = 1;
for(int j = 0; j < m; j ++)
{
if(num[i][j] != 0)
{
if(first && a[i][j] != '*'){
printf("%3d.",num[i][j]);
first = 0;
}
bool pr = 0;
while(a[i][j] != '*' && j < m)
{
pr = 1;
printf("%c",a[i][j]);
j ++;
}
if(pr)
printf("\n");
if(a[i][j] == '*')
{
first = 1;
continue;
}
//printf("%c",a[i][j]);
}
}
}
int kk = 0;
printf("Down\n");
for(int j = 0; j < m; j ++)
{
int first = 1;
for(int i = 0; i < n; i ++)
{
if(num[i][j] != 0)
{
if(first && a[i][j] != '*'){
//printf(" %d.",num[i][j]);
b[++kk].nu = num[i][j];
first = 0;
}
int kkk = 0;
while(a[i][j] != '*' && i < n)
{
//printf("%c",a[i][j]);
b[kk].c[kkk ++] = a[i][j];
i ++;
}
b[kk].c[kkk] = '\0';
if(a[i][j] == '*')
{
first = 1;
continue;
}
//printf("%c",a[i][j]);
}
}
}
sort(b + 1, b + 1 + kk, cmp);
for(int i = 1; i <= kk; i ++)
{
printf("%3d.%s\n",b[i].nu, b[i].c);
}
}
return 0;
}