题意:输入一个r行c列的网格,黑格用*号表示,每个白格都填有一个字母。如果一个白格的左边相邻位置或者上边相邻位置没有白格(可能是黑格,也可能出了网格边界),则称这个白格是一个起始格。首先把所有起始格从左到右,从上到下顺序编号1,2,3,。。。。要求找出所有横向单词。这些单词必须从一个起始格开始,向右延伸到一个黑格的左边或者整个网格的最右边。最后找出所有的竖向单词。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#pragma comment (linker,"/STACK:102400000,102400000")
#define maxn 105
#define MAXN 2005
#define mod 1000000009
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-6
typedef long long ll;
using namespace std;
struct St
{
int x,y;
int r,c;
}st[111];
char mp[12][12];
int n,m;
int main()
{
int cas=0;
while (scanf("%d",&n),n)
{
scanf("%d",&m);
// if (cas) printf("\n");
for (int i=0;i<n;i++)
scanf("%s",mp[i]);
// for (int i=0;i<n;i++)
// printf("%s\n",mp[i]);
int num=1;
for (int i=0;i<n;i++)
{
for (int j=0;j<m;j++)
{
if(mp[i][j]!='*')
{
if ((i-1)<0||(j-1)<0||mp[i-1][j]=='*'||mp[i][j-1]=='*')
{
st[num].x=i;
st[num].y=j;
if ((j-1)<0||mp[i][j-1]=='*') st[num].r=1; else st[num].r=0;
if ((i-1)<0||mp[i-1][j]=='*') st[num].c=1; else st[num].c=0;
num++;
}
}
}
}
if (cas)
printf("\n");
// printf("num=%d\n",num);
printf("puzzle #%d:\nAcross\n",++cas);
for (int i=1;i<num;i++)
{
if (st[i].r)
{
printf("%3d.",i);
for (int j=st[i].y;j<m;j++)
{
if (mp[ st[i].x ][j]=='*')
break;
printf("%c",mp[ st[i].x ][j]);
}
printf("\n");
}
}
// printf("num=%d\n",num);
printf("Down\n");
for (int i=0;i<num;i++)
{
if (st[i].c)
{
printf("%3d.",i);
for (int j=st[i].x;j<n;j++)
{
if (mp[j][ st[i].y ]=='*')
break;
printf("%c",mp[j][ st[i].y ]);
}
printf("\n");
}
}
// printf("\n");
}
return 0;
}