首页 > 学院 > 开发设计 > 正文

算典03_习题_10_UVA-1587

2019-11-08 03:02:04
字体:
来源:转载
供稿:网友

Box

题意

输入六个矩形的长和宽,判断是否可以组成长方体

题解

如果六个矩形的长和宽呈如下格式,便可组成:

a b a b b c b c a c a c

(a, b, c 分别代表三种数,且互相可以相等) 下面一步一步来处理 首先在输入时给长宽排序,即对每一个矩形数据有: 左 < 右 然后我使用一个二维数组vis[maxn][maxn]来维护一种矩形的出现次数(vis[a][b]即为矩形(a,b)出现的次数),每当一种矩形出现满两次时,就计数一次,这样最后计数如果不等于3的话就说明不可能组成长方体 但是就算是计数等于3了,也不一定可以组成,比如说:

1 2 1 2 1 2 1 2 1 2 1 2

或者

1 1 1 1 1 1 1 1 1 2 1 2

等这样的数据就不行,那么还要满足什么条件呢 我发现,如果我统计a b c 的出现次数的话,理论上来说 a b c 都应该是4的整数倍才行,然而上面两个样例好像并不满足这个条件 而且我也认为如果在计数等于3的前提下满足了这个条件,那么它一定就可以组成矩形了,所以这里就统计一下abc的出现次数即可

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int maxn = 1e4 +5;#define met(a,b) memset(a, b, sizeof(a));int a[6][2];int vis[maxn][maxn];int b[maxn];int main(){ #ifdef _LOCAL freopen("in.txt","r", stdin); #endif // _LOCAL while(scanf("%d%d", &a[0][0], &a[0][1]) == 2){ if(a[0][0] > a[0][1]) swap(a[0][0], a[0][1]); for(int i = 1; i < 6; ++i){ scanf("%d%d", &a[i][0], &a[i][1]); if(a[i][0] > a[i][1]) swap(a[i][0], a[i][1]); } //计数 met(vis, 0);met(b, 0); int cnt = 0; for(int i = 0; i < 6; ++i){ if(!vis[a[i][0]][a[i][1]] || vis[a[i][0]][a[i][1]] >= 2) { vis[a[i][0]][a[i][1]] = 0; ++cnt; } ++vis[a[i][0]][a[i][1]]; ++b[a[i][0]]; ++ b[a[i][1]]; } if(cnt != 3) {PRintf("IMPOSSIBLE/n");continue;} //判断a b c 的出现次数 bool flag = 0; for(int i = 0; i < 6; ++i){ if(b[a[i][0]] % 4 || b[a[i][1]] % 4){flag = 1; break;} } if(flag)printf("IMPOSSIBLE/n"); else printf("POSSIBLE/n"); } return 0;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表