题意:从*点开始,标记所有能走到的点,X代表墙,下划线原样输出
AC:40ms
#include<stdio.h> #include<iostream> #include<queue> #include<memory.h> using namespace std; struct DIR { int r; int c; } dir[] = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } }; const int MAXR = 31; const int MAXC = 81; void bfs(queue<DIR> q, int maps[][MAXC]) { DIR d; while (!q.empty()) { d = q.front(); q.pop(); int nr, nc; for(int i = 0; i < 4; i++) { nr = d.r + dir[i].r; nc = d.c + dir[i].c; if(maps[nr][nc] != 1) continue; maps[nr][nc] = 2; DIR dd; dd.r = nr; dd.c = nc; q.push(dd); } } } int main() { freopen("d:\1.txt", "r", stdin); int n; cin >> n; getchar(); while (n--) { int r = 0, c = 0; char cc; int maps[MAXR][MAXC]; int sr, sc; memset(maps, 0, sizeof(maps)); string str; //getline(cin, str); while (getline(cin, str)) { if(str.at(0) == '_') break; int length = str.length(); if(length > c) c = length; for(int i = 0; i < length; i++) { cc = str.at(i); if(cc == ' ' || cc == '*') { maps[r][i] = 1; } if(cc == '*') { sr = r; sc = i; } if(cc == 'X') { maps[r][i] = -1; } } r++; } DIR d; d.r = sr; d.c = sc; queue<DIR> q; q.push(d); bfs(q, maps); for(int i = 0; i < r; i++) { for(int j = 0; j < c; j++) { if(maps[i][j] == 0) break; if(maps[i][j] == -1) cout << 'X'; if(maps[i][j] == 2) cout << '#'; if(maps[i][j] == 1) cout << ' '; } cout << endl; } cout << str << endl; } return 0; }