zoukankan      html  css  js  c++  java
  • 【Codeforces Round #423 (Div. 2) B】Black Square

    Link:http://codeforces.com/contest/828/problem/B

    Description

    给你一个n*m的格子;
    里面包含B和W两种颜色的格子;
    让你在这个格子中画一个正方形;
    (大小,位置自己选但要求覆盖到所有现有的黑棋子);
    然后,把里面的白棋子,染成黑棋子;
    问你最少需要染多少个白棋子;

    Solution

    先得到一个矩形(这个矩形覆盖所有的黑棋子);
    然后枚举所需要的正方形的左上角的位置;
    这个正方形必然要覆盖这个矩形;
    则这个左上角只能在这个正方形的左上角的左上方,或和正方形的左上角重合;
    取那个矩形的右下角,只要正方形能够覆盖到右下角,就能覆盖整个矩形;
    剩下的就不难写了;
    获取正方形应该有的最小边长;
    然后统计这个正方形里面W的个数就好;

    NumberOf WA

    0

    Reviw

    做题的时候不用着急:)
    慢慢想

    Code

    #include <bits/stdc++.h>
    using namespace std;
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define LL long long
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    #define mp make_pair
    #define pb push_back
    #define fi first
    #define se second
    #define ms(x,y) memset(x,y,sizeof x)
    #define Open() freopen("F:\rush.txt","r",stdin)
    #define Close() ios::sync_with_stdio(0)
    
    typedef pair<int,int> pii;
    typedef pair<LL,LL> pll;
    
    const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
    const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
    const double pi = acos(-1.0);
    const int N = 110;
    
    int n,m,mini = N,maxi = 0,minj = N,maxj = 0;
    char s[N][N];
    
    int main(){
        scanf("%d%d",&n,&m);
        rep1(i,1,n) scanf("%s",s[i]+1);
        rep1(i,1,n){
            rep1(j,1,m)
            if (s[i][j]=='B'){
                mini = min(mini,i);
                maxi = max(maxi,i);
                minj = min(minj,j);
                maxj = max(maxj,j);
            }
        }
        if (maxi==0){
            printf("1
    ");
            return 0;
        }
        int num = N*N;
        rep1(i,1,n){
            rep1(j,1,m){
                if (i <= mini && j <= minj){
                    int lenj = maxj-j+1,leni = maxi-i+1;
                    lenj = max(lenj,leni);
                    int rj = j + lenj-1,ri = i + lenj -1;
                    if (rj > m || ri > n) continue;
                    int temp = 0;
                    rep1(ii,i,ri)
                        rep1(jj,j,rj)
                            if (s[ii][jj]=='W')
                                temp++;
                    num = min(num,temp);
                }
            }
        }
        if (num > n*n)
            printf("-1
    ");
        else
            printf("%d
    ",num);
        return 0;
    }
  • 相关阅读:
    Centos启动Cassandra交互模式失败:No appropriate python interpreter found
    删除Kafka的topic
    《面向中国资本市场应用的分布式总账白皮书》笔记
    搭建Kafka集群(3-broker)
    【转】矩阵求导计算规则
    二次型求导
    解决: org.iq80.leveldb.DBException: IO error: C:data rie00945.sst: Could not create random access file.
    SSH遇见的问题
    解决:Redis:java.util.NoSuchElementException: Unable to validate object at
    【转】mysql查询结果输出到文件
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626206.html
Copyright © 2011-2022 走看看