//我觉得该注意的地方,都写在注释里了,这题应该也算水题,不难,数据也没有特殊的格式,比较需要注意的就是,写循环的时候,不要把自己绕进去绕晕了 #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; }