Code:
#include<iostream>
#include<cstdio>
using namespace std;
int a,b,c;
int main() {
scanf("%d%d%d",&a,&b,&c);
if(a+2*b+3*c!=1029) {
printf("No");
return 0;
}
printf("Yes\n");
/*
3 4 7 -> 30 33 34
1 5 3 -> 9 31 30
3 6 1 -> 8 33 9
[3,30]U[1,9]U[3,8]->[3,8]->5
[4,33]U[5,31]U[6,33]->[6,33]->5
[7,34]U[3,30]U[1,9]->[7,9]->1
5*5*1=50
*/
int x[4],y[4],z[4],rx;
for(x[1]=0; x[1]<=7; x[1]++) {
for(y[1]=0; y[1]<=7; y[1]++) {
for(z[1]=0; z[1]<=7; z[1]++) {
for(x[2]=0; x[2]<=7; x[2]++) {
for(y[2]=0; y[2]<=7; y[2]++) {
for(z[2]=0; z[2]<=7; z[2]++) {
for(x[3]=0; x[3]<=7; x[3]++) {
for(y[3]=0; y[3]<=7; y[3]++) {
for(z[3]=0; z[3]<=7; z[3]++) {
int maxx=min(x[3],min(x[1],x[2]))+7,
maxy=min(y[2],min(y[3],y[1]))+7,
maxz=min(z[3],min(z[2],z[1]))+7,
minx=max(x[3],max(x[1],x[2])),
miny=max(y[3],max(y[1],y[2])),
minz=max(z[3],max(z[1],z[2]));
int three=(maxx-minx)*(maxy-miny)*(maxz-minz);
if(three!=c)break;
int ab= (min(x[2],x[1])+7-max(x[2],x[1]))*
(min(y[2],y[1])+7-max(y[2],y[1]))*
(min(z[2],z[1])+7-max(z[2],z[1])),
bc= (min(x[3],x[2])+7-max(x[3],x[2]))*
(min(y[3],y[2])+7-max(y[3],y[2]))*
(min(z[3],z[2])+7-max(z[3],z[2])),
ac= (min(x[3],x[1])+7-max(x[3],x[1]))*
(min(y[3],y[1])+7-max(y[3],y[1]))*
(min(z[3],z[1])+7-max(z[3],z[1]));
int two=bc+ac+ab-3*three;
if(two!=b)break;
else {
// if(x[1]==0&&x[2]==0&&y[3]==0&&z[3]==0&&z[1]==0&&z[2]==0&&y[2]==0&&x[3]==6&&y[1]==6){
printf("%d %d %d %d %d %d %d %d %d",x[1],y[1],z[1],x[2],y[2],z[2],x[3],y[3],z[3]);
// printf("%d %d",three,two);
return 0;
}
}
}
}
}
}
}
}
}
}
return 0;
}
听说 89 是不完全对的,所以求一个 hack。
思路:枚举坐标,求题解