优先放2∗2的正方块,保证相邻正方块填充不重复。之后找没有染色的块按四色顺序填充,如果和相邻块重复就换颜色,直到填满为止。
#include<bits/stdc++.h>
using namespace std;
char grid[1001][1001];
int n,m,x,y;
int main() {
	std::ios::sync_with_stdio(false);
	cin>>n>>m>>x>>y;
	if((n/2)*(m/2)<x){// 放不下四色块 
		cout<<-1;
		return 0;
	}
	for(int i=1;i<=n;i+=2){
		if(x==0) break;
		for(int j=1;j<=m;j+=2){
			if(x==0) break;
			int c=0;
			if(grid[i-1][j]!='a'+0 && grid[i][j-1]!='a'+0){// 能放'a' 
				c=0;
			}else if(grid[i-1][j]!='a'+1 && grid[i][j-1]!='a'+1){// 能放'b'
				c=1;
			}else if(grid[i-1][j]!='a'+2 && grid[i][j-1]!='a'+2){// 能放'c'
				c=2;
			}else if(grid[i-1][j]!='a'+3 && grid[i][j-1]!='a'+3){// 能放'd'
				c=3;
			}
			grid[i][j]='a'+c;
			grid[i+1][j]='a'+c;
			grid[i][j+1]='a'+c;
			grid[i+1][j+1]='a'+c;
			x--;
		}
	}
	for(int i=1;i<=n;++i){
		for(int j=1;j<=m;++j){
			if(!grid[i][j]){// 没有填充
				// 按顺序选哪个字母能填充 
				if(grid[i-1][j]!='a'+0 && grid[i][j-1]!='a'+0){
					grid[i][j]='a'+0;
				}else if(grid[i-1][j]!='a'+1 && grid[i][j-1]!='a'+1){
					grid[i][j]='a'+1;
				}else if(grid[i-1][j]!='a'+2 && grid[i][j-1]!='a'+2){
					grid[i][j]='a'+2;
				}else if(grid[i-1][j]!='a'+3 && grid[i][j-1]!='a'+3){
					grid[i][j]='a'+3;
				}
			}
		}
	}
	for(int i=1;i<=n;++i){
		for(int j=1;j<=m;++j){
			cout<<grid[i][j];
		}
		cout<<endl;
	}
	
	return 0;
}
        小红拿到了一个n行m列的矩阵,他准备用最多四种颜色(分别用字符a,b,c,d表示)为该矩阵的每个格子染色,需要满足以下条件:
每个同色连通块要么是2×2的正方形,要么是1×1的正方形;
2×2的正方形恰好有x个,1×1的正方形恰好有y个。
请你输出一种染色方案。根据四色定理,显然四种颜色是够用的。
第一行输入四个整数n,m,x和y(1≤n,m≤1000;0≤x,y≤n⋅m)。
除此之外,保证n×m=4×x+y。
如果无解,请输出−1。
否则输出一个n行m列的字符矩阵,代表染色的情况。
输入
3 3 1 5
输出
baa
caa
acb
输入
3 3 2 1
输出
-1