234234234

[蓝桥杯2018决赛]整理玩具

 

题目链接: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;
} 

 

。。。。。。。。。。。。。。

posted @ 2020-03-28 23:39  你若愿意,我一定去  阅读(263)  评论(0编辑  收藏  举报
23423423423