1 ///
2 /// 题意:告诉起点终点,踩一次, '.'变成'X',再踩一次,冰块破碎,问是否能使终点冰破碎
3 /// DFS:如题解所说,分三种情况:1. 如果两点重合,只要往外走一步再走回来就行了;2. 若两点相邻,
4 /// 那么要不就是踩一脚就破了或者踩一脚走开再走回来踩一脚破了;3. 普通的搜索看是否能到达,
5 /// 若能还是要讨论终点踩几脚的问题:)
6 /// DFS 耗时大,险些超时,可以用BFS来做
7 ///
8 /// 自己写了一个能AC的,感觉太长比较挫,看到网上有比较短的,注释了下觉得应该自己以后应该写成这样
9 #include <cstdio>
10 #include <algorithm>
11 #include <cstring>
12 #include <queue>
13 #include <string>
14 #include <iostream>
15 using namespace std;
16 const int MAXN = 5e2 + 10;
17 const int INF = 0x3f3f3f3f;
18 int n, m;
19 int sx, sy, ex, ey;
20 char maze[MAXN][MAXN];
21 bool vis[MAXN][MAXN];
22 int dx[4] = {1, -1, 0, 0};
23 int dy[4] = {0, 0, -1, 1};
24
25 bool BFS(void)
26 {
27 queue<pair<int, int> > Q;///2个变量时使用pair,不写结构体,bfs能缩短几行代码
28 Q.push (make_pair (sx, sy));
29 while (!Q.empty ())
30 {
31 int x = Q.front ().first;
32 int y = Q.front ().second;
33 Q.pop ();
34 for (int i=0; i<4; ++i)
35 {
36 int tx = x + dx[i];
37 int ty = y + dy[i];
38
39 if (tx == ex && ty == ey) return true;
40
41 if (tx <= n && tx >= 1 && ty <= m && ty >= 1 && maze[tx][ty] == '.')
42 {
43 maze[tx][ty] = 'X';
44 Q.push (make_pair (tx, ty));
45 }
46 }
47 }
48
49 return false;
50 }
51
52 int main(void)
53 {
54 while (scanf ("%d%d", &n, &m) == 2)
55 {
56 memset (vis, 0, sizeof (vis));
57 for (int i=1; i<=n; ++i)
58 {
59 scanf ("%s", maze[i]+1);
60 }
61 scanf ("%d%d", &sx, &sy);
62 scanf ("%d%d", &ex, &ey);
63
64 int cnt = 0;
65 bool flag = false;
66 ///终点四周'.'的个数
67 for (int i=0; i<4; ++i)///未BFS前就处理出来,免得bfs后处理同样要多几行代码且麻烦,而且这里是处理了所有的情况
68 {
69 int tx = ex + dx[i];
70 int ty = ey + dy[i];
71 if (tx == sx && ty == sy) flag = true;
72 if (tx <= n && tx >= 1 && ty <= m && ty >= 1 && maze[tx][ty] == '.') cnt++;
73 }
74
75 if (sx == ex && sy == ey)///为'X’,四周需要至少一个'.'来做铺垫(走到‘.’,再走回来)
76 {
77 if (cnt >= 1) puts ("YES");
78 else puts ("NO");
79 }
80 else if (flag)///起点和终点相邻,分终点是‘X’ 还是‘.’的情况
81 {
82 if (maze[ex][ey] == 'X') puts ("YES");
83 else
84 {
85 if (cnt >= 1) puts ("YES");///是‘.’的话 同样需要周围至少有一个'.'来做铺垫
86 else puts ("NO");
87 }
88 }
89 else
90 {
91 ///起点和终点不相邻的情况,BFS是否连通
92 if (BFS () == true)
93 {
94 if (maze[ex][ey] == 'X') puts ("YES");
95 else if (cnt >= 2) puts ("YES");///终点和起点不相邻时,终点周围至少要有2个.才能满足要求
96 else puts ("NO");
97 }
98 else puts ("NO");
99 }
100 }
101 return 0;
102 }