Gym 101630D Designing the Toy (暴力+找规律)

题目要求根据a、b、c的值确定三维空间中1×1×1立方体的排列方式。通过尝试找到一种解决方案:在最大值对应平面斜放,然后按特定顺序填充。当a*b<c时,无法满足条件输出-1。提供了一段实现该策略的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

题意:给出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<cstdio>  
#include<algorithm>  
#include<vector>  
#include<queue>  
#include<string>  
#include<cstring>  
#include<iostream>  
using namespace std;
#define ll long long  
const int maxn = 1e5 + 500;
struct node {
	int x, id;
}a[5];
int mark[200][200];
bool cmp(node xx, node yy) {
	return xx.x < yy.x;
}
int main() {
	while (~scanf("%d%d%d", &a[0].x, &a[1].x, &a[2].x)) { 
		a[0].id = 0, a[1].id = 1, a[2].id = 2;//记录下标
		memset(mark, 0, sizeof(mark));
		sort(a, a + 3,cmp);
		if (a[0].x*a[1].x < a[2].x) {
			printf("-1\n"); continue;
		}
		else printf("%d\n",a[2].x);
		int k;
		if (a[2].id == 2) {
			if (a[1].id == 1)k = 1;
			else k = 2;
		}
		else if (a[2].id == 1) {
			if (a[1].id == 2)k = 3;
			else k = 4;
		}
		else {
			if (a[1].id == 2)k = 5;
			else k = 6;
		}
		int aa = a[0].x, bb = a[1].x, cc = a[2].x, cnt = a[2].x;
		for (int i = 1; i <= aa; i++) {
			if (k == 1 || k == 2)printf("1 %d %d\n", i, i);
			else if(k==3||k==4)printf("%d 1 %d\n", i, i);
			else printf("%d %d 1\n", i, i);
			mark[i][i] = 1;
		}
		for (int i = aa + 1; i <= bb; i++) {
			if (k == 1) printf("1 %d %d\n", aa, i), mark[aa][i] = 1;
			else if(k==2) printf("1 %d %d\n", i, aa), mark[i][aa] = 1;
			else if(k==3)printf("%d 1 %d\n", aa, i), mark[aa][i] = 1;
			else if (k == 4)printf("%d 1 %d\n", i, aa), mark[i][aa] = 1;
			else if (k == 5)printf("%d %d 1\n", aa, i), mark[aa][i] = 1;
			else printf("%d %d 1\n", i, aa), mark[i][aa] = 1;
		}
		cnt -= bb;
		for(int i=1;i<=aa;i++)
			for(int j=1;j<=bb;j++)
				if (cnt && !mark[i][j]) {
					if (k == 1) printf("1 %d %d\n", i, j);
					else if (k == 2) printf("1 %d %d\n", j, i);
					else if (k == 3)printf("%d 1 %d\n", i, j);
					else if (k == 4)printf("%d 1 %d\n", j, i);
					else if (k == 5)printf("%d %d 1\n", i, j);
					else printf("%d %d 1\n", j, i);
					cnt--;
				}
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值