ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

cf1551 D2. Domino (hard version)

2022-06-05 12:01:38  阅读:207  来源: 互联网

标签:格子 奇数 int Domino hard 偶数 骨牌 y2 D2


题意:

给定空的 n×m 棋盘,用 1×2 横骨牌和 2×1 竖骨牌放满棋盘。要求不能重叠且横骨牌的数量恰为 k。

输入 n,m,k。n,m <= 100

思路:

n m 不能都为奇数。

若 n 为偶数:先考虑第一列,第一列中被竖骨牌占据的格子数必为偶数,剩下的偶数个格子要放偶数个横骨牌,因此会向第二列 “伸出” 偶数个骨牌。第二列中有偶数个格子被竖骨牌占据,偶数个格子被第一列伸过来的横骨牌占据,另有偶数个空格子需要放横骨牌。

以此类推,发现横骨牌的数量即 k 必须为偶数。(当然横骨牌不能太多,否则放不下,故还应要求 k <= n×(m/2)

若 n 为奇数,则 m 为偶数:还是先考虑第一列,第一列中被竖骨牌占据的格子数必为偶数,剩下的奇数个格子要放奇数个横骨牌,因此会向第二列 “伸出” 奇数个骨牌。第二列中有偶数个格子被竖骨牌占据,奇数个格子被第一列伸过来的横骨牌占据,另有偶数个空格子需要放横骨牌。

事实上,第 1,3,5,... 列都必须向下一列 “伸出” 奇数个(即至少一个)横骨牌。那就不妨在一开始先把一行放满,转化为 n 为偶数的情形。

const signed N = 3 + 100;
char g[N][N];

void paint(int x1, int y1, int x2, int y2) { //涂色,不能与周围相同
    char c = 'a';
    while(g[x1-1][y1]==c||g[x1+1][y1]==c||g[x1][y1-1]==c||
        g[x1][y1+1]==c||g[x2-1][y2]==c||g[x2+1][y2]==c||
        g[x2][y2-1]==c||g[x2][y2+1]==c) c++;
    g[x1][y1] = g[x2][y2] = c;
}

bool work(int n, int m, int k) { //构造答案
    if(n % 2) { //n为奇数
        if(m % 2 || k < m/2 || !work(n-1,m,k-m/2)) return 0;//m为奇或者横骨牌太少
        for(int i = 1; i <= m; i += 2) paint(n,i,n,i+1);//放满最后一行
        return 1;
    }
    if(k % 2 || k > n*(m/2)) return 0; //特判一下无解情况
    for(int j = 1; j <= m; j += 2) //每次涂2*2格
        for(int i = 1; i <= n; i += 2)
            if(k) paint(i,j,i,j+1), paint(i+1,j,i+1,j+1), k -= 2;
            else paint(i,j,i+1,j), paint(i,j+1,i+1,j+1);
    return 1;
}

void sol() {
    int n, m, k; cin >> n >> m >> k;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            g[i][j] = 0;
    
    if(!work(n,m,k)) return cout << "NO" << endl, void();
    cout << "YES" << endl;
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= m; j++)
            cout << g[i][j];
        cout << endl;
    }
}

标签:格子,奇数,int,Domino,hard,偶数,骨牌,y2,D2
来源: https://www.cnblogs.com/wushansinger/p/16343678.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有