mark有一块100×100的矩形的土地,左下角的坐标为(0,0)右上角的坐标为(100,100)。他无聊的时候在里面种满了西瓜,但是总有人来偷,于是他买了两个守卫。
一个守卫的守卫范围是(x1,y1)到(x2,y2)的一块矩形范围,其中(x1,y1)代表左下角(x2,y2)代表右上角。
mark认为被两个守卫看护的区域是强安全区域,仅被一个守卫看护的区域是弱安全区域,而没有被守卫看护的区域是不安全区域。现在mark想让你告诉他这三种区域的面积分别是多少。
输入有两行,每行四个整数x1,y1,x2,y2;分别表示两个守卫的看护区域。
其中0≤x1<x2,y1<y2≤100,且两个矩形肯定有公共区域。
一行三个整数分别表示强安全区域,弱安全区域,不安全区域的面积。
10 10 20 20
15 15 25 25
25 150 9825
三种情况
这题看起来挺麻烦,
本来不想做的。。。
这种手算起来非常简单的题,,,
写成代码是挺麻烦。
此题无非就是几种情况。。
先判断出没有强安全区域的时候,(上下左右四种)
剩下的再分四种分别判断计算(左上左下右上右下),其实还有一种被包围在里面,
所以说不严谨,但交上去也能过。
是个纯模拟题,下面给出
以上思路的ac代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 using namespace std; 7 8 int x,y,xx,yy; 9 int a,b,aa,bb; 10 int strong,thin,none; 11 12 int main() 13 { 14 scanf("%d%d%d%d",&x,&y,&xx,&yy); 15 scanf("%d%d%d%d",&a,&b,&aa,&bb); 16 thin=(aa-a)*(bb-b)+(xx-x)*(yy-y); 17 if(a>xx||b>yy||aa<x||bb<y) 18 { 19 none=10000-thin; 20 printf("0 %d %d",thin,none); 21 return 0; 22 } 23 else 24 { 25 if(a>=x&&a<=xx&&bb>=y&&bb<=yy) 26 strong=(xx-a)*(bb-y); 27 if(a>=x&&a<=xx&&b>=y&&b<=yy) 28 strong=(xx-a)*(yy-b); 29 if(aa>=x&&aa<=xx&&bb>=y&&bb<=yy) 30 strong=(aa-x)*(bb-y); 31 if(aa>=x&&aa<=xx&&b>=y&&b<=yy) 32 strong=(aa-x)*(yy-b); 33 none=10000-thin+strong; 34 thin-=strong*2; 35 printf("%d %d %d",strong,thin,none); 36 return 0; 37 } 38 }
测试点比较少,能过,,
感觉很牵强,,,
推荐按照题解给出的方法,
用二维数组做更简单一些吧。
可以看成是100*100个小格,每个小格面积为一。
循环用二维数组将第一个矩形内的小格都置为1,
当循环第二个矩形时,如果有被置为1的,那就是重合的,
强安全区域++就好了,顺便再置为2,表示重复区域,
非重复区域可以置为0;
然后2的区域就是强安全区域,
1和0的区域就是弱安全区域,
剩下的就是不安全的了。
思路大概就是这样,,
代码不写了。
如果你不开心,那我就把右边这个帅傻子分享给你吧,
你看,他这么好看,跟个zz一样看着你,你还伤心吗?
真的!这照片盯上他五秒钟就想笑了。
一切都会过去的。
时间时间会给你答案2333