(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦
上图:
题目:codeforces round#487:div2 C-传送门
题面内容及样例在最下面
思路:
接下来就不用我讲了,矩阵直接50*50,模拟就行了。
不过为什么这样可行呢?
因为这样分块之后,每种颜色有25*25的大小。
而每种颜色最多有100个。
每块的每行最多放12个,为了不破坏所属块的连通性。
每次要间隔一行放置其他颜色。
所以每个块最多可以放数量12*12的其他颜色而不影响它自己的连通性。
如此,本题就结束了。
闲话:
如果这个题把颜色改多一点,或者每种颜色的数量更多。
输出改成如果构造不出这种图案就输出No;反之,输出任一符合条件的图案。
改成这个样子,应该会更有意思一点吧,嘿嘿。。。
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 100+5;
int a,b,c,d;
char mp[N][N];
void paint(int n,int m,char c){
for(int i=n;i<n+25;++i){
for(int j=m;j<m+25;++j){
mp[i][j]=c;
}
}
}
int dir[4][2]={1,0,0,1,-1,0,0,-1};
bool ok(int x,int y,char c){
for(int i=0;i<4;++i){
int px=x+dir[i][0],py=y+dir[i][1];
if(px<0||py<0||px>=50||py>=50)continue;
if(mp[px][py]==c)return false;
}
return true;
}
int main(int argc, char const *argv[]){
while(~scanf("%d%d%d%d",&a,&b,&c,&d)){//题目保证abcd都大于1
printf("50 50\n");
paint(0,0,'A');paint(0,25,'B');
paint(25,0,'C');paint(25,25,'D');
if(a>1){//暴力处理每个块,其实4处代码本质一样的,复制粘贴了而已
for(int i=0;i<25&&a>1;i+=2){
for(int j=25;j<50&&a>1;++j){
if(ok(i,j,'A')){
mp[i][j]='A';
a--;
}
}
}
}
if(b>1){
for(int i=0;i<25&&b>1;i+=2){
for(int j=0;j<25&&b>1;++j){
if(ok(i,j,'B')){
mp[i][j]='B';
b--;
}
}
}
}
if(c>1){
for(int i=25;i<50&&c>1;i+=2){
for(int j=25;j<50&&c>1;++j){
if(ok(i,j,'C')){
mp[i][j]='C';
c--;
}
}
}
}
if(d>1){
for(int i=25;i<50&&d>1;i+=2){
for(int j=0;j<25&&d>1;++j){
if(ok(i,j,'D')){
mp[i][j]='D';
d--;
}
}
}
}
for(int i=0;i<50;++i){
mp[i][50]='\0';
printf("%s\n",mp[i] );
}
}
return 0;
}
题面: