关于计算矩阵相交的思考

 思路历程:1.打算进行分类讨论,并用if语句进行判断计算。然而.......很明显工作量巨大。浅浅贴一张我的这一思路的代码吧

#include<stdio.h>
int main()
{int s,chang,kuan,max=0,min=0;
int Ax1,Ax2,Bx1,Bx2;
int Ay1,Ay2,By1,By2;

scanf("%d%d%d%d\n",&Ax1,&Ay1,&Ax2,&Ay2);
scanf("%d%d%d%d",&Bx1,&By1,&Bx2,&By2);
//默认右上角横坐标大于左下角的横坐标进行的比较
if(Ax2>Bx2)
{
	if(Bx2>Ax1>Bx1)
chang=Bx2-Ax1;
   if(Bx2>Bx1>Ax1)
chang=Bx2-Bx1;
}
else if(Bx2>Ax2)
{
	if(Ax2>Ax1>Bx1)
chang=Ax2-Ax1;
    if(Ax2>Bx1>Ax1)
chang=Ax2-Bx1;
}
else if(Ax2=Bx2)
{
	if(Ax1<Bx1)
		chang=Ax2-Bx1;
	if(Ax1>Bx1)Sz
	chang=Ax2-Ax1;
}
else if(Ax1=Bx1)
{
	if(Ax2<Bx2)
		chang=Ax2-Bx1;
	if(Ax2>Bx2)
	chang=Bx2-Ax1;
}
else ;
//默认左上角的纵坐标高于右下角的纵坐标进行的比较
if(Ay1>By1)
{
	if(By1>Ay2>By2)
kuan=By1-Ay2;
    if(By1>By2>Ay2)
kuan=By1-By2;
}
else if(By1>Ay1)
{
	if(Ay1>Ay2>By2)
kuan=Ay1-Ay2;
    if(Ay1>By2>Ay2)
kuan=Ay1-By2;
}
else if(Ay1=By1)
{
	if(Ay2<By2)
		kuan=Ay1-By2;
	if(Ay2>By2)
	kuan=Ay1-Ay2;
}
else if(Ay2=By2)
{
	if(Ay1<By1)
		kuan=Ay1-By2;
	if(Ay1>By1)
	kuan=By1-Ay2;
}  
else;
   s=chang*kuan;
	printf("%d",s);


	return 0;


}

它看上去很复杂,然而,它依然是错误的,因为当我输入了题目的测试数据后,我发现了我的默认是错误的,左上角的纵坐标(y)不一定大于右下角纵坐标(y),右下角的横坐标(x)也不一定大于左上角的横坐标。

然而通过观察,我发现了,求相交矩形的面积,本质就是四个X进行大小排序,中间两个X之间的差的绝对值与四个Y进行大小排序,中间两个y之间的差的绝对值。(算法原理)

所以,我找到了方法二

#include<stdio.h>
int max(int a,int b)
{
	 if (a>b)
         return a;
         else 
			return b;}
int min(int a,int b)
{
	if (a>b)
     return b;
    else 
	return a;
}
int main()
{
int s,chang1,kuan1,chang2,kuan2,m,n;
int Ax1,Ax2,Bx1,Bx2;
int Ay1,Ay2,By1,By2;
scanf("%d%d%d%d\n",&Ax1,&Ay1,&Ax2,&Ay2);
scanf("%d%d%d%d",&Bx1,&By1,&Bx2,&By2);
chang1=min(max(Ax1,Ax2),max(Bx1,Bx2));
chang2=max(min(Ax1,Ax2),min(Bx1,Bx2));
m=chang1-chang2;

kuan1=min(max(Ay1,Ay2),max(By1,By2));
kuan2=max(min(Ay1,Ay2),min(By1,By2));
n=kuan1-kuan2;

if(m>0&&n>0)
	s=m*n;
return 0;
}

这串代码实际上并不是我独立写出来的,因为我确实没有想到去定义函数来实现它。然而这并不影响我们学习和拓宽自己的知识。

先来简单分析一下

这段代码通提前声明了max,min两个函数简化了if语句的多种情况判断。他通过max函数和min函数先取出了四个x之间中较大的两个数,并选出了其中较小的那个,也就是第二大的那个x,同理,改变了两者的使用顺序,选出来第三大的那个x,两个x相减得到a。y同理。

然后判断a,b是否符合要求,相乘就得到了相交矩形的面积。

总结一下我这道题的学习过程以及所得结论吧

1.通过尝试与思考才会发现简单的规律,有了规律才能尝试新的思路。

2.虽然老师不建议抄代码,但是我觉得看看新的代码,看看别人是如何实现自己未能实现的思路并无不可,还可以学到新的用法和知识,也是一件好事。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值