//我觉得该注意的地方,都写在注释里了,这题应该也算水题,不难,数据也没有特殊的格式,比较需要注意的就是,写循环的时候,不要把自己绕进去绕晕了
#include <bits/stdc++.h>
using namespace std;
const int N = 12;
char maze[N][N];
int num[N][N];
void shownum(int r, int c)
{
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
cout << num[i][j] << " ";
cout << endl;
}
}
int main()
{
int r, c;
int kase = 0;
while (cin >> r)
{
if (!r) break;
cin >> c;
int m = 1;
memset(num, 0, sizeof(num));
for (int i = 0; i < r; i++)
for (int j = 0; j < c; j++)
cin >> maze[i][j];
for (int i = 0; i < r; i++)
for (int j = 0; j < c; j++)//找出所有起始格并编号
{
if (maze[i][j] == '*')
continue;//首先要是白格,才有可能是起始格
if (i == 0 || j == 0 || (i > 0 && maze[i - 1][j] == '*') || (j > 0 && maze[i][j - 1] == '*'))
{
num[i][j] = m++;
}
}
// shownum(r, c);
if (kase) cout << endl;
else kase = 1;
cout << "puzzle #" << kase++ << ":" << endl << "Across" << endl;
for (int i = 0; i < r; i++)
{
// int j = 0; //这句一定要注意!当初想当然,把它和for循环的第一句int i = 0 放在了一起,现在想来真是太不仔细了!应该是外层循环每走一次,都要把j重新初始化为0,有些类似冒泡的双重循环,慎之!!!
for (int j = 0; j < c; j++)
{
if (num[i][j] == 0) continue;
/* {
j++;//此处一定不要忘记j的自增,使得判断对象变为该行的下一列,若漏掉这句,可能会无限循环
continue;//如果为起始格,对应的num数组里的值不会是0
}*/
cout << setw(3) << num[i][j] << "." << maze[i][j];
/* j++;
while (j < c && maze[i][j] != '*')
{
cout << maze[i][j];
j++;
}*/
for (j = j + 1; j < c && maze[i][j] != '*'; j++) cout << maze[i][j];
cout << endl;
}
}
cout << "Down" << endl;
for (int i = 0; i < r; i++)
for (int j = 0; j < c; j++)
{
if (!num[i][j]) continue;
cout << setw(3) << num[i][j] << "." << maze[i][j];
/* int k = i + 1;
while (k < r && maze[k][j] != '*')
{
cout << maze[k][j];
num[k][j] = 0; //起始格原来分为两类,横着的起始格和竖着的,如果是横情况下的起始格,并在竖着时作为普通字母格输出,则它在此后,也不能再作为任何竖列的起始格
k++;
}*/
for (int k = i + 1; k < r && maze[k][j] != '*'; k++)
{
cout << maze[k][j];
num[k][j] = 0;
}
cout << endl;
}
}
return 0;
}