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个字节