题目:http://codeforces.com/gym/100971/problem/J
题目理解:chrome翻译的其中一段文字:从每个自由细胞中,只有通过共享一侧的细胞移动,才有可能到达所有其他自由细胞。
所有细胞是连通的,AB之间连通。
#include<vector> #include<iostream> #include<string> using namespace std; int main() { int n, m; cin >> n >> m; int cnt = 0; bool flag = true; vector<string> a(n);//定义存储n个string类型元素的向量容器 for (int i = 0; i < n; i++) { cin >> a[i];//按行输入,输入第i行 } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) {//cnt计算内部点(i,j)(非#点)周围有几个不是# if (a[i][j] == '#')//如果(i,j)这个点是#退出当前循环,继续下一个循环 continue; cnt = 0; if (i != 0 && a[i - 1][j] != '#')//如果该点的上方不是#,cnt++ cnt++; if (i != n - 1 && a[i + 1][j] != '#') cnt++; if (j != 0 && a[i][j - 1] != '#') cnt++; if (j != m-1 && a[i][j + 1] != '#') cnt++; if (cnt >= 3)//若(i,j)的四周有3或4个不是#,即存在T型区域,输出YES并结束 { cout << "YES" << endl; return 0; } if (cnt == 1)//如果内部点(非#点)存在四周只有一个不是#,则不存在 flag = false;//false赋值给flag } } if (flag) cout << "YES" << endl; else cout << "NO" << endl; return 0; }