xtu oj 3个矩形与1个正方形

发布于:2024-12-18 ⋅ 阅读:(47) ⋅ 点赞:(0)

文章目录

回顾

前言

写之前我应该先搜一下题解的。这题有题解,但是我傻傻写了很长,但是非常爽啊,哈哈哈!因为一次就 ac 了,很久没有这种体验了。

代码

#include<stdio.h>
#include<stdbool.h>

bool get_1(int x1,int y1,int x2,int y2,int x3,int y3){
	//水平先放两个,然后剩下的一个放右边或者放下面,传入的是剩下的矩形的长和宽,注意它这个输入的长和宽可能宽大于长
	//不对,这里把所有参数都传进来,只是传的顺序不一样,水平放两个矩形的话,这两个矩形的长度需要相等
	//至少要有一条边相等,才有可能可以
	//这个时候我考虑的是 x1==x2 的情况
	if(x1==x3&&y1+y2+y3==x1){
		return true;
	}//考虑的是第三个矩形放在右边
	if(x1+x3==y3&&y1+y2==y3){
		return true;//考虑的是第三个矩形放在下面
	}
	return false;//上下左右是对称的,假设前面两种不行,那就是,水平放两个,剩下一个去放不能构成正方形
	//我现在想的是,我们能不能写一个循环,让这三个矩形的变量依次作为当前函数的参数
	//该函数的前提条件是 x1==x2 ,我们在函数内部没有判断,调用函数的时候判断一下就好了
}

bool get_2(int x1,int y1,int x2,int y2,int x3,int y3){
	//这种我考虑的是先竖直放两个,然后剩下的放在右边或者下面,因为是对称的,所以应该是考虑完全了
	//但是我在想,矩形旋转会不会对结果造成影响,或者我们只是需要判断能不能构成正方形,是不是可以交换长和宽
	//也不是真的交换,就是在传入函数参数的时候换一下位置
	//先写完这个函数再考虑剩下的
	//当前考虑的是,有两个矩形的宽相等
	//y1==y2
	if(x1+x2==x3&&x1+x2==y2+y3){
		return true;//左边两个竖直放,然后右边放一个
	}
	if(y2==y3&&x1+x2+x3==y3){
		return true;
	}
	return false;//除了放右边,放下面(对称的放左边和放上面是一个意思),其他的情况就是不能构成正方形
}

int main(){
	int t;
	scanf("%d",&t);
	
	while(t--){
		int a1,b1,a2,b2,a3,b3;
		scanf("%d%d%d%d%d%d",&a1,&b1,&a2,&b2,&a3,&b3);
		//我想了一下,应该考虑全面了,还要多考虑一下矩形转动的问题
		//这个应该换一下参数就可以了,我们先看一下有没有任意两个矩形的边相等
		//假设三个矩形找不到两条相等的边,直接输出 No 就可以了,不然的话,可以找一下答案
		//找答案就是调用上面的两个函数
		//现在是有三组数字,我们在三组数字里面找一对相等的数字,要求是在不同的组
		//所以其实长和宽完全可以互换,我们的要求就是不同的矩形之间找一条相等的边
		//这个时候还要考虑有多条相等的边该怎么办
		//一个一个找,遍历多少遍?一个边比较四次,最好用数组吧,用这个变量可能还不太方便
		//用 pair 吗 ,但是我不会用啊,比较少,我直接傻傻列举出来算了,但是情况太多了呀
		//循环真是个好东西
		//反正我先存到数组里面吧
		//我怎么表示三对数之间的关系,怎么存会比较方便
		//二维数组存
		int s[5][5];
		s[0][0]=a1;
		s[0][1]=b1;
		s[1][0]=a2;
		s[1][1]=b2;
		s[2][0]=a3;
		s[2][1]=b3;
		//这样存应该可以了,但是有一个问题,就是我们循环一遍之后,我们要比较前面的,要绕到前面去
		//比如说第一个矩形的边可以和第二个,第三个去比
		//第二个也要和第一个,还有第三个去比,哦哦,不用,力的作用是相互的,这里相等也是相互的
		//也就是一和二三比较完了之后,二和三再比较一遍,就包括了所有的情况了
		//没有遗漏
//		那就开始循环!
		bool success=false;
//		for(int i=0;i<2;i++){
//			for(int j=0;j<2;j++){
//				if(s[i][j]==s[i+1][j]){
//					if(get_1(s[i][j],s[i][j+1],s[i+1][j],s[i+1][j+1],s[i+2][j],s[i+2][j+1])||
//						get_2(s[i][j+1],s[i][j],s[i+1][j+1],s[i+1][j],s[i+2][j+1],s[i+2][j])||
//						get_1(s[i][j],s[i][j+1],s[i+1][j],s[i+1][j+1],s[i+2][j+1],s[i+2][j])||
//						get_2(s[i][j+1],s[i][j],s[i+1][j+1],s[i+1][j],s[i+2][j+1],s[i+2][j])
//						){
//						success=true;
//					}
//				}//我这里傻了,感觉应该可以用 1-j 来表示另一个元素的
//				if(s[i][j]==s[i+1][j+1]){
//					if(get_1(s[i][j],s[i][j+1],s[i+1][j],s[i+1][j+1],s[i+2][j],s[i+2][j+1])||
//						get_2(s[i][j+1],s[i][j],s[i+1][j],s[i+1][j+1],s[i+2][j+1],s[i+2][j])||
//						get_1(s[i][j],s[i][j+1],s[i+1][j],s[i+1][j+1],s[i+2][j+1],s[i+2][j])||
//						get_2(s[i][j+1],s[i][j],s[i+1][j],s[i+1][j+1],s[i+2][j+1],s[i+2][j])
//						){
//						success=true;
//					}
//				}
//				if(s[i][j]==s[i+2][j]&&i+2<3){
//					if(get_1(s[i][j],s[i][j+1],s[i+2][j],s[i+1][j+1],s[i+2][j],s[i+2][j+1])||
//						get_2(s[i][j+1],s[i][j],s[i+1][j+1],s[i+2][j],s[i+2][j+1],s[i+2][j])||
//						get_1(s[i][j],s[i][j+1],s[i+2][j],s[i+1][j+1],s[i+2][j+1],s[i+2][j])||
//						get_2(s[i][j+1],s[i][j],s[i+1][j+1],s[i+2][j],s[i+2][j+1],s[i+2][j])
//						){//不对啊,我第三个矩形还是不行,我还是得手动输入,因为越界了,我直接枚举十二种算了
//						success=true;
//					}
//				}
//				if(s[i][j]==s[i+2][j+1]&&i+2<3){
//					if(get_1(s[i][j],s[i][j+1],s[i+1][j],s[i+1][j+1],s[i+2][j],s[i+2][j+1])||
//						get_2(s[i][j+1],s[i][j],s[i+1][j+1],s[i+1][j],s[i+2][j+1],s[i+2][j])||
//						get_1(s[i][j],s[i][j+1],s[i+1][j],s[i+1][j+1],s[i+2][j+1],s[i+2][j])||
//						get_2(s[i][j+1],s[i][j],s[i+1][j+1],s[i+1][j],s[i+2][j+1],s[i+2][j])
//						){
//						success=true;
//					}
//				}
//			}
//		}
		//比如说,长是 s[0][j] ,那么宽就是 s[0][1-j],但是有什么用呢
		//哦哦,其实数了一下,就总共十二次比较,可以全部列出来,没啥问题
		//也不用十二次,反正应该可以暴力列出来,先不慌,先写一下循环
		
		if(s[0][0]==s[1][0]){
			if(get_1(s[0][0],s[0][1],s[1][0],s[1][1],s[2][0],s[2][1])||
				get_1(s[0][0],s[0][1],s[1][0],s[1][1],s[2][1],s[2][0])||
				get_2(s[0][1],s[0][0],s[1][1],s[1][0],s[2][0],s[2][1])||
				get_2(s[0][1],s[0][0],s[1][1],s[1][0],s[2][1],s[2][0])
				){
				success=true;
			}
		}
		if(s[0][0]==s[1][1]){
			if(get_1(s[0][0],s[0][1],s[1][1],s[1][0],s[2][0],s[2][1])||
				get_1(s[0][0],s[0][1],s[1][1],s[1][0],s[2][1],s[2][0])||
				get_2(s[0][1],s[0][0],s[1][0],s[1][1],s[2][0],s[2][1])||
				get_2(s[0][1],s[0][0],s[1][0],s[1][1],s[2][1],s[2][0])
				){
				success=true;
			}
		}
		if(s[0][0]==s[2][0]){
			if(get_1(s[0][0],s[0][1],s[2][0],s[2][1],s[1][0],s[1][1])||
				get_1(s[0][0],s[0][1],s[2][0],s[2][1],s[1][1],s[1][0])||
				get_2(s[0][1],s[0][0],s[2][1],s[2][0],s[1][0],s[1][1])||
				get_2(s[0][1],s[0][0],s[2][1],s[2][0],s[1][1],s[1][0])
				){
				success=true;
			}
		}
		if(s[0][0]==s[2][1]){
			if(get_1(s[0][0],s[0][1],s[2][1],s[2][0],s[1][0],s[1][1])||
				get_1(s[0][0],s[0][1],s[2][1],s[2][0],s[1][1],s[1][0])||
				get_2(s[0][1],s[0][0],s[2][0],s[2][1],s[1][0],s[1][1])||
				get_2(s[0][1],s[0][0],s[2][0],s[2][1],s[1][1],s[1][0])
				){
				success=true;
			}
		}
		//上面是四个判断
		//表示第一条边和另外两个矩形的四条边可能相等的情况
		
		//下面也是四个判断,表示第一个矩形的第二条边和另外两个矩形的四条边的可能的情况
		if(s[0][1]==s[1][0]){
			if(get_1(s[0][1],s[0][0],s[1][0],s[1][1],s[2][0],s[2][1])||
				get_1(s[0][1],s[0][0],s[1][0],s[1][1],s[2][1],s[2][0])||
				get_2(s[0][0],s[0][1],s[1][1],s[1][0],s[2][0],s[2][1])||
				get_2(s[0][0],s[0][1],s[1][1],s[1][0],s[2][1],s[2][0])
				){
				success=true;
			}
		}
		if(s[0][1]==s[1][1]){
			if(get_1(s[0][1],s[0][0],s[1][1],s[1][0],s[2][0],s[2][1])||
				get_1(s[0][1],s[0][0],s[1][1],s[1][0],s[2][1],s[2][0])||
				get_2(s[0][0],s[0][1],s[1][0],s[1][1],s[2][0],s[2][1])||
				get_2(s[0][0],s[0][1],s[1][0],s[1][1],s[2][1],s[2][0])
				){
				success=true;
			}
		}
		if(s[0][1]==s[2][0]){
			if(get_1(s[0][1],s[0][0],s[2][0],s[2][1],s[1][0],s[1][1])||
				get_1(s[0][1],s[0][0],s[2][0],s[2][1],s[1][1],s[1][0])||
				get_2(s[0][0],s[0][1],s[2][1],s[2][0],s[1][0],s[1][1])||
				get_2(s[0][0],s[0][1],s[2][1],s[2][0],s[1][1],s[1][0])
				){
				success=true;
			}
		}
		if(s[0][1]==s[2][1]){
			if(get_1(s[0][1],s[0][0],s[2][1],s[2][0],s[1][0],s[1][1])||
				get_1(s[0][1],s[0][0],s[2][1],s[2][0],s[1][1],s[1][0])||
				get_2(s[0][0],s[0][1],s[2][0],s[2][1],s[1][0],s[1][1])||
				get_2(s[0][0],s[0][1],s[2][0],s[2][1],s[1][1],s[1][0])
				){
				success=true;
			}
		}
		
		//下面是第二个矩形的第一条边和第三个矩形的两条边的两种情况
		
		if(s[1][0]==s[2][0]){
			if(get_1(s[1][0],s[1][1],s[2][0],s[2][1],s[0][0],s[0][1])||
				get_1(s[1][0],s[1][1],s[2][0],s[2][1],s[0][1],s[0][0])||
				get_2(s[1][1],s[1][0],s[2][1],s[2][0],s[0][0],s[0][1])||
				get_2(s[1][1],s[1][0],s[2][1],s[2][0],s[0][1],s[0][0])
				){
				success=true;
			}
		}
		if(s[1][0]==s[2][1]){
			if(get_1(s[1][0],s[1][1],s[2][1],s[2][0],s[0][0],s[0][1])||
				get_1(s[1][0],s[1][1],s[2][1],s[2][0],s[0][1],s[0][0])||
				get_2(s[1][1],s[1][0],s[2][0],s[2][1],s[0][0],s[0][1])||
				get_2(s[1][1],s[1][0],s[2][0],s[2][1],s[0][1],s[0][0])
				){
				success=true;
			}
		}
		
		//下面是第二个矩形的第二条边和第三个矩形的两条边的两种情况
		if(s[1][1]==s[2][0]){
			if(get_1(s[1][1],s[1][0],s[2][0],s[2][1],s[0][0],s[0][1])||
				get_1(s[1][1],s[1][0],s[2][0],s[2][1],s[0][1],s[0][0])||
				get_2(s[1][0],s[1][1],s[2][1],s[2][0],s[0][0],s[0][1])||
				get_2(s[1][0],s[1][1],s[2][1],s[2][0],s[0][1],s[0][0])
				){
				success=true;
			}
		}
		if(s[1][1]==s[2][1]){
			if(get_1(s[1][1],s[1][0],s[2][1],s[2][0],s[0][0],s[0][1])||
				get_1(s[1][1],s[1][0],s[2][1],s[2][0],s[0][1],s[0][0])||
				get_2(s[1][0],s[1][1],s[2][0],s[2][1],s[0][0],s[0][1])||
				get_2(s[1][0],s[1][1],s[2][0],s[2][1],s[0][1],s[0][0])
				){
				success=true;
			}
		}
		
		
		if(success){
			printf("Yes\n");
		}else{
			printf("No\n");
		}
	}
	
	return 0;
}

思路

我的思考过程其实都在注释里面了,哈哈哈。这题真好。原来有题解,我就不献丑了。纯粹记录一下吧,以后自己无意间看到,原来有一个小孩,傻傻写了 12 个 if ,总共写了一个多小时。下面贴一下题解的链接。

本来想看一下题解的,但是我其实不是很感兴趣,ac 了就行了()


网站公告

今日签到

点亮在社区的每一天
去签到