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;
    }
  • 相关阅读:
    较全的ASCII码对照表
    关于.NET Framework 3.5 SP1 bootstrapper 包(安装和部署)的解决方案
    C#中DllImport用法和路径问题
    在Winform中给的button等控件添加快捷键的几种方法。
    DataGridView之为每行前面添加序号
    【软件设计过程PowerDesigner v12简介】
    死锁与活锁的区别,死锁与饥饿的区别
    性能优化之 — AS3.0对象池运用
    wc之“HelloWorld”
    php之memcache缓存技术
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626206.html
Copyright © 2011-2022 走看看