题目链接:http://oj.ecustacm.cn/problem.php?id=1401
具体看代码注解:
#include <iostream> #include <cstring> #include <vector> #include <queue> #include <algorithm> using namespace std; string matrix[15]; vector<char> chs; int T,N,M,flag; void InitData() { for (int i = 0; i < 15; i++) { matrix[i].clear(); } chs.clear(); } int main() { while(~scanf("%d", &T)) { while(T--) { scanf("%d%d", &N, &M); flag = true; for (int i = 0; i < N; i++) { cin >> matrix[i]; } // 拿取包含的有哪些字符 vector<char>::iterator it; for (int i = 0; i < N; i++) { for (int j = 0; j < matrix[i].size(); j++) { it = find(chs.begin(), chs.end(), matrix[i][j]); if (it == chs.end() && flag) {// 之前没有添加 和前面的字符都成立 (组成矩形的左上角的第一个字符) chs.push_back(matrix[i][j]);// 拿到第一个字符 // 开始判断 ,开始向右和下延申 // 主要判断该字符的全部字符能否组成矩形 int w,h; w = h = 1; int i1 = i, j1 = j; // 向右延申,确定宽度w while(++j1 < M && matrix[i][j1]==matrix[i][j]) { w++; } // 向下延申,确定高度h while(++i1 < N && matrix[i1][j]==matrix[i][j]) { h++; } // 拿到高度后,开始搜索矩形内是否有其他字符存在 for (i1 = i; i1 < i+h; i1++) { for (j1 = j; j1 < j+w; j1++) { if (matrix[i][j] != matrix[i1][j1]) { flag = false; break; } } if (!flag) break; } if (!flag) break; // 搜索矩形外是否有该字符存在 for (int i2 = 0; i2 < N; i2++) { for (int j2 = 0; j2 < matrix[i2].size(); j2++) { if (!(i2 >= i && i2 < i+h && j2 >= j && j2 < j+w)) {// 排除矩形内 if (matrix[i][j] == matrix[i2][j2]) { flag = false; break; } } } if (!flag) break; } } if (!flag) break; } } if (flag) { cout << "YES" << endl; } else { cout << "NO" << endl; } InitData(); } } return 0; }
。。。。。。。。。。。。。。