codeforces 432E Square Tiling

codeforces 432E Square Tiling

题意

题解

代码

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define rep(i, a, b) for(int i=(a); i<(b); i++)
#define sz(x) (int)x.size()
#define de(x) cout<< #x<<" = "<<x<<endl
#define dd(x) cout<< #x<<" = "<<x<<" "
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;

const int N = 111;

int n, m;
bool in[N][N];
int ans[N][N], ban[N][N];

int calc(int x) {
    for(int i = 0; ; ++i) if(!(x>>i&1)) return i;
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    cin >> n >> m;
    rep(i, 1, n+1) rep(j, 1, m+1) in[i][j] = 1;
    memset(ans, -1, sizeof(ans));
    rep(i, 1, n+1) rep(j, 1, m+1) if(ans[i][j]==-1) {
        int c = calc(ban[i][j]), k; 
        rep(t, 1, n+1) {
            bool ok = 1;
            if(i+t-1>n||j+t-1>m) ok = 0;
            rep(x, i, i+t) if(ans[x][j+t-1]!=-1 || calc(ban[x][j+t-1])>c) ok = 0;
            rep(y, j, j+t) if(ans[y][i+t-1]!=-1 || calc(ban[y][i+t-1])>c) ok = 0;
            if(!ok) break;
            k = t;
            if(j+t<=m&&c>calc(ban[i][j+t])) break;
        }
        rep(x, i, i+k) rep(y, j, j+k) ans[x][y] = c;
        rep(x, i, i+k) ban[x][j-1] |= (1<<c), ban[x][j+k] |= (1<<c);
        rep(y, j, j+k) ban[i-1][y] |= (1<<c), ban[i+k][y] |= (1<<c);
    }
    rep(i, 1, n+1) {
        rep(j, 1, m+1) cout << (char)(ans[i][j]+'A');
        cout << endl;
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/wuyuanyuan/p/9297175.html