UVA1587-Box

2018-10-29-17:30:17

原题链接

题目描述:

  给定6个矩形的长和宽,判断它们是否能够构成长方体的6个面。

本题思路:

  将输入的数据保存在数组内(建议使用结构体数组),每次输入的时候将较大的数字放在前面,输入完毕之后对整个结构体进行排序,接着只需按照顺序比对相应成员是否相等即可,接着检查长和宽和高是否对应相等即可。

本题注意点:

  输入时排序可以逆序也可以顺序排,最后对结构体排序也可以顺序或者逆序排,但是切记排序的时候要将长方形的长和宽都考虑进去。

AC代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <iostream>
 5 using namespace std;
 6 #define count 6
 7 struct rectengle{
 8     int length,width;
 9 }cube[count];
10 bool cmp(const rectengle a,const rectengle b){
11     return a.length==b.length? a.width>b.width : a.length>b.length;
12 }
13 
14 int main()
15 {
16     while(cin>>cube[0].length>>cube[0].width){
17         bool flag=true;
18         if(cube[0].length<cube[0].width)    swap(cube[0].length,cube[0].width);
19         for(int i=1;i<count;i++){
20             cin>>cube[i].length>>cube[i].width;
21             if(cube[i].length<cube[i].width)    swap(cube[i].length,cube[i].width);
22         }
23         sort(cube,cube+count,cmp);
24         if(memcmp(cube,cube+1,sizeof(rectengle))||memcmp(cube+2,cube+3,sizeof(rectengle))||memcmp(cube+4,cube+5,sizeof(rectengle)))
25             flag=false;
26         if(cube[0].length!=cube[2].length||cube[2].width!=cube[4].width||cube[0].width!=cube[4].length)
27             flag=false;
28         flag?cout<<"POSSIBLE"<<endl:cout<<"IMPOSSIBLE";
29     }
30     return 0;
31 }

 

本题应熟记知识点:

<1>:sort函数:

  头文件:#include <algorithm>

  实现原理:sort并不是简单的快速排序,它对普通的快速排序进行了优化,此外,它还结合了插入排序和推排序。系统会根据你的数据形式和数据量自动选择合适的排序方法,这并不是说它每次排序只选择一种方法,它是在一次完整排序中不同的情况选用不同方法,比如给一个数据量较大的数组排序,开始采用快速排序,分段递归,分段之后每一段的数据量达到一个较小值后它就不继续往下递归,而是选择插入排序,如果递归的太深,他会选择堆排序。

  具体函数实现请参考:http://www.cnblogs.com/fengcc/p/5256337.html

  本题中利用sort函数对结构体进行排序,参数包含三个,第一个参数是要排序的数组的起始地址,第二个参数是结束的地址(最后一位要排序的地址的下一地址),第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。

  如果想要从大到小排序,只需在函数第三个函数中写入下面这个函数即可。

1 bool compare(int a,int b)
2 {
3 return a>b;
4 }

  sort函数还可以实现更广泛的功能,例如本题中遇到的,如果长方形的长相等就对宽进行排序。

<2>:memcmp函数:

  头文件:#include<cstring>

  函数原型:int memcmp(const void *buf1, const void *buf2, unsigned int count);

  函数功能:比较内存区域buf1和buf2的前count个字节

    当buf1<buf2时,返回值小于0;
    当buf1==buf2时,返回值=0;
    当buf1>buf2时,返回值大于0。
  
posted @ 2018-10-29 17:30  Cruel_King  阅读(269)  评论(0编辑  收藏  举报