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