Designing the Toy ( 空间几何 )
题意:给出a,b,c分别表示沿着z轴,y轴,x轴能看到的立体小方块的数目(每个都是1×1×1的),若存在一种在这个三维空间的放置方法使得a,b,c存在,那么输入容易一种情况的个数和每个小立方体离(0,0,0)最近点的坐标,否则输出-1.
题解:这里没有推导过程,只有多次尝试后得到的一种方便的放置方案,就是在a,b,c最大值所对的平面打斜着放置先(eg:题目给出那组样例a=4,b=3,c=5,那么就是在下图这个二维平面来放置,先打斜着放三个黄色的(因为min(a,b)=3),然后由于a还差一,因此再从绿色那个方块位置开始放,一直向左直到a=4,剩下的就是在a*b的这个二维平面白色部分随便放置即可,直道c=5,那么从这里就可以发现-1的情况就是a*b<c (a<=b<=c).(由于实力不足,旋转绕的有点晕,所以输出直接暴力做了,知道规律就可以自己做了哈~)
代码:
#include <bits/stdc++.h>
using namespace std;
int a,b,c;
int via[300][300];
int main()
{
memset(via,0,sizeof(via));
int x,y,z;
cin >> a >> b >> c;
if ( a>=b && a>=c ) {
if ( a>b*c ) { // 放不下了
printf("-1\n");
return 0;
}
else printf("%d\n",a);
z = 0;
int len = min(b,c);
int maxn = max(b,c);
for ( int i=0; i<len; i++ ) { // 先斜着放
printf("%d %d 0\n",i,i);
}
if ( b>c ) { // 根据条件往一个地方延长
for ( int i=len; i<maxn; i++ ) {
printf("%d %d 0\n",i,len-1);
via[i][len-1] = 1;
}
}
else if ( c>b ) {
for ( int i=len; i<maxn; i++ ) {
printf("%d %d 0\n",len-1,i);
via[len-1][i] = 1;
}
}
int cnt = a-maxn; // 还需要放cnt个
for ( int x=0; x<b&&cnt>0; x++ ) { // 插空放,便利所有能放的点
for ( int y=0; y<c&&cnt>0; y++ ) {
if ( via[x][y]==1 || x==y ) continue ;
printf("%d %d 0\n",x,y);
cnt --;
}
}
}
else if ( b>=a && b>=c ) {
if ( b>a*c ) {
printf("-1\n");
return 0;
}
else printf("%d\n",b);
y = 0;
int len = min(c,a);
int maxn = max(c,a);
for ( int i=0; i<len; i++ ) {
printf("%d 0 %d\n",i,i);
}
if ( a>c ) {
for ( int i=len; i<maxn; i++ ) {
printf("%d 0 %d\n",i,len-1);
via[i][len-1] = 1;
}
}
else if ( c>a ) {
for ( int i=len; i<maxn; i++ ) {
printf("%d 0 %d\n",len-1,i);
via[len-1][i] = 1;
}
}
int cnt = b-maxn;
for ( int x=0; x<a&&cnt>0; x++ ) {
for ( int z=0; z<c&&cnt>0; z++ ) {
if ( via[x][z]==1 || x==z ) continue ;
printf("%d 0 %d\n",x,z);
cnt --;
}
}
}
else if ( c>=a && c>=b ) {
if ( c>b*a ) {
printf("-1\n");
return 0;
}
else printf("%d\n",c);
x = 0;
int len = min(b,a);
int maxn = max(b,a);
for ( int i=0; i<len; i++ ) {
printf("0 %d %d\n",i,i);
}
if ( a>b ) {
for ( int i=len; i<maxn; i++ ) {
printf("0 %d %d\n",i,len-1);
via[i][len-1] = 1;
}
}
else if ( b>a ) {
for ( int i=len; i<maxn; i++ ) {
printf("0 %d %d\n",len-1,i);
via[len-1][i] = 1;
}
}
int cnt = c-maxn;
for ( int y=0; y<a&&cnt>0; y++ ) {
for ( int z=0; z<b&&cnt>0; z++ ) {
if ( via[y][z]==1 || z==y ) continue ;
printf("0 %d %d\n",y,z);
cnt --;
}
}
}
return 0;
}