这是一道字符串模拟题,题意大概是给定一个m*n的网格,黑格用‘*’表示,白格有一个字母,如果一个白格左边或者上面没有黑格子,则称为一个起始格。
然后找出所有横向单词和竖向单词,注意这个地方的横向单词指从一个起始格开始一直往右或者往下,直到遇见黑格子或者出界,并且每个字母在找横向或者竖向单词时只能用一
次 ,所以分为两个步骤,横向找和竖向找,每次判断该格子是不是起始格,并且是否在前面的单词中用过,若没用过就找下去,用过了则继续往下找起始格。
具体代码如下:
#include <iostream>
#include <cstdio>
#include <string.h>
#include <map>
#include <stack>
#include <queue>
#include <algorithm>
#include <math.h>
#include <vector>
#include <set>
#define from(i,a,n) for(int i=a;i<n;i++)
#define refrom(i,n,a) for(int i=n;i>=a;i--)
#define EPS 1e-10
#define mod 1000000007
using namespace std;
const double INF=0x3f3f3f3f;
const int MAX =11;
char puzzle[MAX][MAX],record[MAX][MAX];//这里的record数组用来记录起始格是否已经用于构成单词
int r,c,pos;
void across()
{
int cnt=0;
memset(record,0,sizeof(record));
printf("Across\n");
from(i,0,r)
{
from(j,0,c)//从左往右,从上往下扫描
{
int y=j;
if(i==0&&puzzle[i][j]!='*')//第一行所有不是黑格子的都是起始格
{
cnt++;
if(!record[i][j]) printf("%3d.",cnt);//如果该起始格没有用过,则一定可以找到一个单词
else continue;
while(puzzle[i][y]!='*'&&y<c)//往右输出,一直到遇见黑格子或者越界
{
if(!record[i][y])
{
printf("%c",puzzle[i][y]);
record[i][y++]=1;
}
else break;
}
printf("\n");
continue;
}
if(j==0&&puzzle[i][j]!='*')//第一列所有不是黑格子的但是起始格
{
cnt++;
if(!record[i][j]) printf("%3d.",cnt);
else continue;
while(puzzle[i][y]!='*'&&y<c)
{
if(!record[i][y])
{
printf("%c",puzzle[i][y]);
record[i][y++]=1;
}
else break;
}
printf("\n");
continue;
}
if(puzzle[i][j]!='*'&&(puzzle[i][j-1]=='*'||puzzle[i-1][j]=='*'))//不是黑格子并且左边或者上面是黑格子的
{
cnt++;
if(!record[i][j]) printf("%3d.",cnt);
else continue;
while(puzzle[i][y]!='*'&&y<c)
{
if(!record[i][y])
{
printf("%c",puzzle[i][y]);
record[i][y++]=1;
}
else break;
}
printf("\n");
continue;
}
}
}
return ;
}
void down()
{
int cnt=0;
memset(record,0,sizeof(record));
printf("Down\n");
from(i,0,r)
{
from(j,0,c)
{
int x=i;
if(i==0&&puzzle[i][j]!='*')
{
cnt++;
if(!record[i][j]) printf("%3d.",cnt);
else continue;
while(puzzle[x][j]!='*'&&x<r)
{
if(!record[x][j])
{
printf("%c",puzzle[x][j]);
record[x++][j]=1;
}
else break;
}
printf("\n");
continue;
}
if(j==0&&puzzle[i][j]!='*')
{
cnt++;
if(!record[i][j]) printf("%3d.",cnt);
else continue;
while(puzzle[x][j]!='*'&&x<r)
{
if(!record[x][j])
{
printf("%c",puzzle[x][j]);
record[x++][j]=1;
}
else break;
}
printf("\n");
continue;
}
if(puzzle[i][j]!='*'&&(puzzle[i][j-1]=='*'||puzzle[i-1][j]=='*'))
{
cnt++;
if(!record[i][j]) printf("%3d.",cnt);
else continue;
while(puzzle[x][j]!='*'&&x<r)
{
if(!record[x][j])
{
printf("%c",puzzle[x][j]);
record[x++][j]=1;
}
else break;
}
printf("\n");
continue;
}
}
}
return ;
}
int main()
{
int t=0;
while(cin>>r)
{
if(r==0) break;
cin>>c;
getchar();
from(i,0,r)
gets(puzzle[i]);
if(t) printf("\n");
printf("puzzle #%d:\n",++t);
across();//横向找
down();//竖向找
}
return 0;
}