Sample Input
2 2
AT
O
6 7
AIMDEN
MEONE
UPONTO
SOERIN
SAOR*
IES*DEA
0
Sample Output
puzzle #1:
Across
1.AT
3.O
Down
1.A
2.TO
puzzle #2:
Across
1.AIM
4.DEN
7.ME
8.ONE
9.UPON
11.TO
12.SO
13.ERIN
15.SA
17.OR
18.IES
19.DEA
Down
1.A
2.IMPOSE
3.MEO
4.DO
5.ENTIRE
6.NEON
9.US
10.NE
14.ROD
16.AS
18.I
20.A
C++代码:
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
#define _for(i,a,b) for(int i=(a);i<(b);++i)
struct Point{
int x,y;
Point(int x=0,int y=0):x(x),y(y){}
};
typedef Point Vector;
Vector operator+(const Vector& a,const Vector& b){
return Vector(a.x+b.x,a.y+b.y);
}
int R,C;
const int MAXN=16;
char grid[MAXN][MAXN];
inline bool valid(const Point& p){
return p.x<R&&p.x>=0&&p.y>=0&&p.y<C;
}
int Crossword(){
char buf[MAXN];int bufLen;
const Vector dLeft(0,-1),dUp(-1,0),dRight(0,1),dDown(1,0);
for(int t=1;scanf("%d%d",&R,&C)==2&&R;t++){
std::vector<Point> eligible;
std::vector<int> down,across;
if(t>1) puts("");
printf("puzzle #%d:\n",t);
_for(i,0,R){
scanf("%s",grid[i]);
_for(j,0,C){
if(grid[i][j]=='*') continue;
Point p(i,j),left=p+dLeft,up=p+dUp;
bool isCross=!valid(left)||grid[left.x][left.y]=='*';
bool isDown=!valid(up)||grid[up.x][up.y]=='*';
if(isCross) across.push_back(eligible.size());
if(isDown) down.push_back(eligible.size());
if(isCross||isDown) eligible.push_back(p);
}
}
puts("Across");
for(auto n:across){
bufLen=0,memset(buf,0,sizeof(buf));
Point p=eligible[n];
while(valid(p)&&grid[p.x][p.y]!='*'){
buf[bufLen++]=grid[p.x][p.y];
p=p+dRight;
}
printf("%3d.%s\n",n+1,buf);
}
puts("Down");
for(auto n:down){
bufLen=0;memset(buf,0,sizeof(buf));
Point p=eligible[n];
while(valid(p)&&grid[p.x][p.y]!='*'){
buf[bufLen++]=grid[p.x][p.y];
p=p+dDown;
}
printf("%3d.%s\n",n+1,buf);
}
}
return 0;
}
int main(){
Crossword();
return 0;
}