私はこの質問は、彼の主な出力を理解することであると感じ、彼の出力で見つけることができますが、少数の大口注文からであり、各文字が再び預金を使用して、限り適切に初期化され、配列の寄託番号を開くには、1回のみ可能です場合、それはOKで
、出発点を見つけるために、二段階とにかく
出力列の単語の後、出力クロスワードパズルを
(注意は、二つのグループ間の空行がOHであることがあります)
#include <bits/stdc++.h>
using namespace std;
int main()
{
int r,l,wen = 0; // wen表示问题个数
while(scanf("%d",&r)==1 && r)
{
scanf("%d",&l);
int ge = 0,b[12][12]={0},c[12][12]={0};
char a[12][12]={'\0'};
for (int i = 0; i < r;i++)
scanf("%s",a[i]); //读入 r行
//起始寻找
for (int i = 0; i < r;i++)
for (int j = 0; j < l;j++)
{ //上 左
if((i==0||j==0||a[i-1][j]=='*'||a[i][j-1]=='*')&&a[i][j]!='*')
b[i][j] = ++ge;;
}
//暴力找数
if(wen) printf("\n");
printf("puzzle #%d:\n",++wen);
printf("Across\n");
for (int i = 0; i < r; i++)
for (int j = 0; j < l; j++)
{
if(b[i][j]&&!c[i][j]) // 找的数既要是起始点,有要没用过
{
printf("%3d.",b[i][j]);
int x = i,y =j;
while(x<r && y<l && a[x][y]!='*')
{
putchar(a[x][y]);
c[x][y] = 1;
y++;
}
printf("\n");
}
}//across
printf("Down\n");
memset(c,0,sizeof(c)); // 刚才用了先清空
for (int i = 0; i < r; i++)
for (int j = 0; j < l; j++)
{
if(b[i][j]&&!c[i][j])
{
printf("%3d.",b[i][j]);
int x = i,y =j;
while(x<r && y<l && a[x][y]!='*')
{
putchar(a[x][y]);
c[x][y] = 1;
x++;
}
printf("\n");
}
}
}
return 0;
}