zoukankan      html  css  js  c++  java
  • [蓝桥杯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;
    } 

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

  • 相关阅读:
    【APIO2008】免费道路[最小生成树 kruskal]
    【2019.8.13】
    【矩阵】
    [POI2008]BLO-Blockade [tarjan 割点]
    poj1458 最长公共子序列 (动态规划)
    最长上升子序列
    poj1163 数字三角形 (动态规划)
    快速幂 (分治)
    求排列的逆序数(分治)
    快速排序 (分治)
  • 原文地址:https://www.cnblogs.com/hello-dummy/p/12590255.html
Copyright © 2011-2022 走看看