bfs
View Code
#include#include #include #include #include using namespace std;#define maxn 30struct Point{ int x, y;} s;int n, m;int dir[8][2] ={{ 1, 0 },{ 0, 1 },{ -1, 0 },{ 0, -1 },{ 1, 1 },{ -1, 1 },{ 1, -1 },{ -1, -1 } };char map[maxn][maxn];bool vis[maxn][maxn];void input(){ for (int i = 0; i < n; i++) scanf("%s", map[i]);}bool in_map(Point &a){ return a.x >= 0 && a.y >= 0 && a.x < n && a.y < m;}int cal(Point &a){ int ret = 0; for (int i = 0; i < 4; i++) { Point b = a; b.x += dir[i][0]; b.y += dir[i][1]; if (!in_map(b) || map[b.x][b.y] == '.') ret++; } return ret;}int bfs(){ memset(vis, 0, sizeof(vis)); queue q; q.push(s); vis[s.x][s.y] = true; int ans = cal(s); while (!q.empty()) { Point a = q.front(); q.pop(); for (int i = 0; i < 8; i++) { Point b = a; b.x += dir[i][0]; b.y += dir[i][1]; if (in_map(b) && map[b.x][b.y] == 'X' && !vis[b.x][b.y]) { q.push(b); ans += cal(b); vis[b.x][b.y] = true; } } } return ans;}int main(){// freopen("t.txt", "r", stdin); while (scanf("%d%d%d%d", &n, &m, &s.x, &s.y), n | m | s.x | s.y) { s.x--; s.y--; input(); printf("%d\n", bfs()); } return 0;}