题目大意是给定6个数对,每个数对代表一个面的长和宽,判断这6个面是否能构成一个长方体。

这种题一看很复杂,但是只要不想多了实际上这就是一个水题。。。

首先说明一下判断的思路:

  2.你以为这样就完了,那么你就错了,不信你试试马上一个WA,我就是这样,其实还漏了一个条件。比如这组测试数据:         

3 3
3 3
3 2
3 2
2 2
2 2

按照第一个条件进行输出会输出POSSIBLE实际上它是IMPOSSIBLE.为什么?因为长方体的不一样长的边数一定是4的倍数,不是的话一定不行,像这一组数据,6个3 6个2一看就不对,所以我们要加上第二个条件,对每一组的输入的长和宽进行计数(这里我是开了一个bk数组,因为是1e4的数据大小所以完全可以开的出来,然后开一个计数数组记录不同的长和宽,然后直接从计数的数组进行循环比较每一个bk[jishu[i]]%4就行了)

2018/10/28 居然有人看我的题解并且hack了,是的我原来的程序对于这组样例

1 1

1 1

2 2

2 2

3 3

3 3

是不对的,hack成功!!!

至于更改我直接加了一个recheck函数进行recheck一下如果两个对面是正方形且边长又不相等,那么肯定是impossible,之前的uva的数据里面没有这组数据所以我也没有注意这个情况

我的代码:

 

 1 #include <bits/stdc++.h>
 2 //#include "fp.h"
 3 using namespace std;
 4 int bk[10010];
 5 int c[20];
 6 struct node
 7 {
 8     int x,y;
 9 }a[10];
10 bool cmp(node aa,node b)
11 {
12     return aa.x==b.x?aa.y>b.y:aa.x>b.x;
13 }
14 bool check(int aa)
15 {
16     if(a[aa].x==a[aa+1].x&&a[aa].y==a[aa+1].y)
17     return true;
18     else
19     return false;
20 }
21 bool recheck(int aa)
22 {
23     if(a[aa].x==a[aa+1].y&&a[aa+2].x==a[aa+3].y&&a[aa].x!=a[aa+2].x)
24     return false;
25     else
26     return true;
27 }
28 main()
29 {
30     //fop();
31     while(cin>>a[0].x>>a[0].y>>a[1].x>>a[1].y>>a[2].x>>a[2].y>>a[3].x>>a[3].y>>a[4].x>>a[4].y>>a[5].x>>a[5].y)    
32     {
33         memset(bk,0,sizeof(bk));
34         int k=0;
35         for(int i=0;i<6;i++)
36         {
37             bk[a[i].x]++;
38             bk[a[i].y]++;
39             if(bk[a[i].x]==1)
40             c[k++]=a[i].x;
41             if(bk[a[i].y]==1)
42             c[k++]=a[i].y;
43         }
44         int ff=1;
45         for(int i=0;i<k;i++)
46         if(bk[c[i]]%4!=0)
47         {
48             ff=0;break;
49         }
50         for(int i=0;i<6;i++)
51         if(a[i].x<a[i].y)
52         {
53             int t;
54             t=a[i].x;
55             a[i].x=a[i].y;
56             a[i].y=t;
57         }
58         sort(a,a+6,cmp);
59         int f=1;
60         for(int i=0;i<5;i+=2)
61         if(!check(i))
62         {
63             f=0;
64             break;
65         }
66         int fff=recheck(0)?1:0;
67         printf("%s\n",(f&&ff&&fff)?"POSSIBLE":"IMPOSSIBLE");
68     }
69 }

 

  

 

 

 

  

相关文章:

  • 2022-12-23
  • 2021-09-30
  • 2021-10-28
  • 2021-07-09
  • 2021-10-29
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-08-16
  • 2022-12-23
  • 2022-12-23
  • 2021-10-16
  • 2022-12-23
  • 2021-08-15
  • 2022-12-23
相关资源
相似解决方案