非常好玩的图形模拟判断题,由于保证了是正方形,一开始就可以排除掉很多数据,然后边长也是固定的,接下去就把所有3种矩形所有可能的排布都试一遍,矩形首先自身可以换方向,故友2^3次,矩形排布互相可以换位置,故友3*2=6种,矩形排的样式共有4种分别为:
111 1 11 1
11 1 1
1
根据这些样式把对应的长宽数据对应进去,因为一开始限制了面积因素和边长,如果一个样式能够在竖边长和横边长都符合正确边长,就一定是正确的答案。具体细节请参考我的代码自己斟酌。
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<string>
#include<cstring>
#include<algorithm>
#include<fstream>
#include<queue>
#include<stack>
#include<vector>
#include<cmath>
#include<iomanip>
#define rep(i,n) for(i=1;i<=n;i++)
#define MM(a,t) memset(a,t,sizeof(a))
#define INF 1e9
typedef long long ll;
#define mod 1000000007
using namespace std;
class rec{
public:
int l,w;
}a[100];
int n,xx;
int f[300][5][5];
int res[500][500];
class point{
public:
int x,y;
}se[10][5];
void fun(int nn,int ii,int jj,int kk){
n++;
f[n][se[nn][1].x][se[nn][1].y]=ii;
f[n][se[nn][2].x][se[nn][2].y]=jj;
f[n][se[nn][3].x][se[nn][3].y]=kk;
}
void setup(){
int i,j,k,nn;
n=0;
se[1][1].x=1; se[1][1].y=1; se[1][2].x=2; se[1][2].y=1; se[1][3].x=3; se[1][3].y=1;
se[2][1].x=1; se[2][1].y=1; se[2][2].x=2; se[2][2].y=1; se[2][3].x=2; se[2][3].y=2;
se[3][1].x=1; se[3][1].y=1; se[3][2].x=1; se[3][2].y=2; se[3][3].x=2; se[3][3].y=1;
se[4][1].x=1; se[4][1].y=1; se[4][2].x=1; se[4][2].y=2; se[4][3].x=1; se[4][3].y=3;
rep(nn,4)
for(i=1;i<=4;i+=3)
for(j=2;j<=5;j+=3)
for(k=3;k<=6;k+=3){
fun(nn,i,j,k);
fun(nn,i,k,j);
fun(nn,j,i,k);
fun(nn,j,k,i);
fun(nn,k,i,j);
fun(nn,k,j,i);
}
}
bool cal(int ii){
int l=0,w=0;
int i,j;
rep(i,3){
if(a[f[ii][i][1]].l==0) continue;
w=0;
rep(j,3){
w+=a[f[ii][i][j]].w;
}
l+=a[f[ii][i][1]].l;
if(w!=xx) return false;
}
if(l!=xx) return false;
return true;
}
void pp(int x,int y,int ii){
int i,j;
for(i=x+1;i<=x+a[ii].l;i++)
for(j=y+1;j<=y+a[ii].w;j++)
res[i][j]=ii;
}
void prt(int ii){
int i,j;
int l=0,w;
rep(i,3){
w=0;
rep(j,3){
if(f[ii][i][j]==0) break;
pp(l,w,f[ii][i][j]);
w+=a[f[ii][i][j]].w;
}
l+=a[f[ii][i][1]].l;
}
printf("%d\n",xx);
rep(i,xx){
rep(j,xx){
if(res[i][j]==1 || res[i][j]==4) printf("A");
else if(res[i][j]==2 || res[i][j]==5) printf("B");
else printf("C");
}
printf("\n");
}
}
int main(){
int i,j;
int sum;
bool ff;
setup();
while(1){
sum=0; MM(res,0); MM(a,0);
rep(i,3){
scanf("%d%d",&a[i].l,&a[i].w);
a[i+3].l=a[i].w; a[i+3].w=a[i].l;
sum+=a[i].l*a[i].w;
}
xx=sqrt(sum+0.1);
if(xx*xx!=sum){
printf("-1\n");
break;
}ff=false;
rep(i,n)
if(cal(i)){
prt(i);
ff=true;
break;
}
if(!ff) printf("-1\n");
break;
}
return 0;
}