纯粹的模拟,无难度 #include <iostream> #include <cstdio> #include <cstring> using namespace std; int main() { int row, col, entry; char grid[12][12]; //freopen("temp.txt", "r", stdin); while (true) { memset(grid, 'O', sizeof(grid)); // 'O'表示出去 cin >> row >> col >> entry; if (!row && !col && !entry) break; for (int i = 1; i <= row; ++i) { for (int j = 1; j <= col; ++j) { cin >> grid[i][j]; } } int r = 1, c = entry, count; int flag[12][12] = {0}; //貌似全部初始为0 for (count = 0; ; ++count) { ++flag[r][c]; //先标记 if (grid[r][c] == 'N') --r; else if (grid[r][c] == 'S') ++r; else if (grid[r][c] == 'W') --c; else if (grid[r][c] == 'E') ++c; else if (grid[r][c] == 'O') { // 出去了 cout << count << " step(s) to exit" << endl; break; } if (flag[r][c] == 2) { // 循环了 row = r; col = c; // 先以循环点作flag=1时判断点 int flg = 0; for (r = 1, c = entry, count = 0; ; ++count) { if (r == row && c == col && flg == 0) { //第一次到循环点 cout << count << " step(s) before a loop of "; count = 0; // 清0为下次到循环点计数 ++flg; } if (r == row && c == col && count != 0 && flg == 1) { //第一次到循环点 cout << count << " step(s)" << endl; break; //第二次到达循环点跳出 } if (grid[r][c] == 'N') --r; else if (grid[r][c] == 'S') ++r; else if (grid[r][c] == 'W') --c; else if (grid[r][c] == 'E') ++c; } break; } } } return 0; }