zoukankan      html  css  js  c++  java
  • B. Hongcow Solves A Puzzle

    http://codeforces.com/contest/745/problem/B

    题目要求的是,给定一个图形,要求里面判断是否有矩形,且仅有一个

    就是

    XXX....

    XXX...X

    是不行的,因为有两个了。

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <assert.h>
    #define IOS ios::sync_with_stdio(false)
    using namespace std;
    #define inf (0x3f3f3f3f)
    typedef long long int LL;
    
    
    #include <iostream>
    #include <sstream>
    #include <vector>
    #include <set>
    #include <map>
    #include <queue>
    #include <string>
    int n, m;
    const int maxn = 2000 + 20;
    char str[maxn][maxn];
    char sub[maxn][maxn];
    int tonext[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
    bool vis[maxn][maxn];
    void dfs(int x, int y) {
        for (int i = 0; i < 4; ++i) {
            int tx = x + tonext[i][0];
            int ty = y + tonext[i][1];
            if (tx >= 1 && tx <= n && ty >= 1 && ty <= m && !vis[tx][ty] && str[tx][ty] == 'X') {
                vis[tx][ty] = true;
                dfs(tx, ty);
            }
        }
    }
    bool check() {
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= m; ++j) {
                if (str[i][j] == 'X' && !vis[i][j]) return false;
            }
        }
        return true;
    }
    void work() {
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= n; ++i) {
            scanf("%s", str[i] + 1);
        }
        int ans = 0;
        for (int i = 1; i <= n; ++i) {
            bool flag1 = false;
            bool flag2 = false;
            bool be = false;
            for (int j = 1; j <= m; ++j) {
                if (str[i][j] == 'X') {
                    if (str[i - 1][j] == 'X') {
                        if (be && !flag1) {
                            cout << "NO" << endl;
                            return;
                        }
                        flag1 = true;
                    }
                    if (str[i + 1][j] == 'X') {
                        if (be && !flag2) {
                            cout << "NO" << endl;
                            return;
                        }
                        flag2 = true;
                    }
                    be = true;
                }
                if (str[i][j] == 'X' && flag1) {
                    if (str[i - 1][j] != 'X') {
                        cout << "NO" << endl;
                        return;
                    }
                }
                if (str[i][j] == 'X' && flag2) {
                    if (str[i + 1][j] != 'X') {
                        cout << "NO" << endl;
                        return;
                    }
                }
            }
        }
    //    cout << "ff" << endl;
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= m; ++j) {
                if (str[i][j] == 'X') {
                    vis[i][j] = true;
                    dfs(i, j);
                    if (check()) {
                        cout << "YES" << endl;
                    } else cout << "NO" << endl;
                    return;
                }
            }
        }
    }
    
    int main() {
    #ifdef local
        freopen("data.txt", "r", stdin);
    //    freopen("data.txt", "w", stdout);
    #endif
        work();
        return 0;
    }
    View Code

    感觉我判断起来有点麻烦啊

  • 相关阅读:
    使用selenium模拟登陆12306以及滑块验证
    网络爬虫之requests模块
    网络爬虫简介
    MongoDB基础操作
    redis集群搭建以及常见问题
    redis的主从复制
    Linux下如何安装mysql
    python 序列化模块
    python os模块和sys模块
    python 时间模块
  • 原文地址:https://www.cnblogs.com/liuweimingcprogram/p/6193847.html
Copyright © 2011-2022 走看看