都是网格内的操作,与Puzzle类似。
#include <cstdio>
#include <cstdlib>
#include <cstring>
char crossword[12][12];
void setwall(int,int);
struct cw
{
int p1,p2;
bool Cross;
bool Down;
};
int main()
{
int row,col,kase=0,first=1;
while(scanf("%d%d%*c",&row,&col)==2 && row)
{
// memset(crossword,0,sizeof(crossword));
int cnt=0;
cw* p=new cw[50];for(int i=0;i<50;i++) p[i].Cross=0,p[i].Down=0; //初始化
for(int i=1;i<=row;i++){
for(int j=1;j<=col;j++)
{
crossword[i][j]=getchar();
}
getchar();
}
setwall(row,col);
for(int i=1;i<=row;i++)
{
for(int j=1;j<=col;j++)
if(crossword[i][j]!='*' && (crossword[i][j-1]=='*' || crossword[i-1][j]=='*'))
{
cnt++;p[cnt].p1=i;p[cnt].p2=j; //存储位置
if(crossword[i][j-1]=='*') p[cnt].Cross=1;
if(crossword[i-1][j]=='*') p[cnt].Down=1;
}
}
if(first) first=0;
else printf("\n");
printf("puzzle #%d:\n",++kase);
printf("Across\n");
for(int i=1;i<=cnt;i++)
{
if(p[i].Cross){
int ro=p[i].p1;
printf("%3d.",i);
for(int uuu=p[i].p2;crossword[ro][uuu]!='*';uuu++)
printf("%c",crossword[ro][uuu]);
printf("\n");
}
}
printf("Down\n");
for(int i=1;i<=cnt;i++)
{
if(p[i].Down){
int co=p[i].p2;
printf("%3d.",i);
for(int vvv=p[i].p1;crossword[vvv][co]!='*';vvv++)
printf("%c",crossword[vvv][co]);
printf("\n");
}
}
delete[] p;
}
}
void setwall(int r,int c){
for(int i=1;i<=c;i++) {
crossword[0][i]='*';
crossword[r+1][i]='*';
}
for(int i=1;i<=r;i++){
crossword[i][0]='*';
crossword[i][c+1]='*';
}
}