题意:
给定A,B,C,D的联通块个数,构造一个符合的图
题解:
这道题使用构造法,就是构造一个东西因为数据范围为1<=a,b,c,d<=100,所以使用底色进行构造,可以把左上角设为B,右上角全部设为A,左下角设为D,右下角设为C,然后进行构造,构造时选择好,不然有个小坑。
#include<bits/stdc++.h> using namespace std; const int maxn=50; char g[maxn][maxn]; void push(char c,int sr,int er,int sc,int ec) { for(int i=sr;i<er;i++){ for(int j=sc;j<ec;j++){ g[i][j]=c; } } return ; } int main() { int a,b,c,d; scanf("%d%d%d%d",&a,&b,&c,&d); a--; b--; c--; d--; push('B',0,25,0,25); push('A',0,25,25,50); push('D',25,50,0,25); push('C',25,50,25,50); for(int i=0;i<25&&a;i++){ for(int j=0;j<25&&a;j++){ if(i%2&&j%2){ g[i][j]='A'; a--; } } } for(int i=0;i<25&&b;i++){ for(int j=25;j<50&&b;j++){ if(i%2==0&&j%2==0){ g[i][j]='B'; b--; } } } for(int i=25;i<50&&c;i++){ for(int j=0;j<25&&c;j++){ if(i%2&&j%2){ g[i][j]='C'; c--; } } } for(int i=25;i<50&&d;i++){ for(int j=25;j<50&&d;j++){ if(i%2==0&&j%2==0){ g[i][j]='D'; d--; } } } printf("%d %d\n",50,50); for(int i=0;i<maxn;i++){ for(int j=0;j<maxn;j++){ printf("%c",g[i][j]); } printf("\n"); } return 0; }