当前位置: 代码迷 >> 综合 >> ???习题3-10 UVa1587 Box
  详细解决方案

???习题3-10 UVa1587 Box

热度:38   发布时间:2024-01-16 14:10:05.0

1.低端暴力枚举法

要点:
1.先判断6个长方形两两相等,然后将三个互异的长方形长和宽存入数组mark,再通过暴力枚举比较,任意两个长方形中必定有两个数相等

#include<stdio.h>
int a[6][2];
int mark[6];int main()
{while (scanf("%d%d", &a[0][0], &a[0][1]) == 2){         //先输入开头的a[0]数组,这样可以保证连续输入for (int i = 1; i < 6; i++)scanf("%d%d", &a[i][0], &a[i][1]);for (int i = 0; i < 6; i++)       //先将长方形长宽排序if (a[i][0]>a[i][1]){int t = a[i][0];a[i][0] = a[i][1];a[i][1] = t;}int n = 0;for (int i = 0; i < 5; i++){if (!a[i][0]) continue;   //遇到0则为已经判断相等的for (int j = i + 1; j < 6; j++){if (!a[j][0]) continue;   //遇到0则为已经判断相等的if (a[i][0] == a[j][0] && a[i][1] == a[j][1]){mark[n++] = a[i][0];mark[n++] = a[i][1];a[j][0] = 0;  //将与前面一个相等的赋值为0break;}}}if (n != 6)printf("IMPOSSIBLE\n");else{if (mark[0] == mark[2]){if ((mark[1] == mark[4] && mark[3] == mark[5]) || (mark[1] == mark[5] && mark[3] == mark[4])){printf("POSSIBLE\n");goto x1;}else printf("IMPOSSIBLE\n");}else if (mark[0] == mark[3]){if ((mark[1] == mark[4] && mark[2] == mark[5]) || (mark[1] == mark[5] && mark[2] == mark[4])){printf("POSSIBLE\n");goto x1; //跳出if判断语句直接到末尾,不用也毫无影响}else printf("IMPOSSIBLE\n");}else if (mark[1] == mark[2]){if ((mark[0] == mark[4] && mark[3] == mark[5]) || (mark[0] == mark[5] && mark[3] == mark[4])){printf("POSSIBLE\n");goto x1;}else printf("IMPOSSIBLE\n");}else if (mark[1] == mark[3]){if ((mark[0] == mark[4] && mark[2] == mark[5]) || (mark[0] == mark[5] && mark[2] == mark[4])){printf("POSSIBLE\n");goto x1;}else printf("IMPOSSIBLE\n");}else printf("IMPOSSIBLE\n");}x1:;  //直接跳到这}return 0;
}

学习心得:
1.goto语句可直接跳出if等判断语句,到后面确定的位置上,可以稍微减少时间
goto语句通常与条件语句配合使用。可用来实现条件转移,构成循环,跳出循环体等功能。
但是,在结构化程序设计中一般不主张使用goto语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。

2.

要点:
1.牵涉到c++的运算符重载,暂时不会,下次有机会还是得学c++,比c还是要简单的

#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
struct NODE
{int h, w;bool operator < (const NODE& rha) const{if(h == rha.h) return w < rha.w;return h < rha.h;}
}a[10];
bool ok()
{if(a[0].h != a[1].h || a[0].w != a[1].w) return false;if(a[2].h != a[3].h || a[2].w != a[3].w) return false;if(a[4].h != a[5].h || a[4].w != a[5].w) return false;if(a[1].h != a[2].h) return false;if(a[1].w != a[4].h) return false;if(a[3].w != a[4].w) return false;return true;
}
int main()
{while(scanf("%d%d", &a[0].h, &a[0].w) != EOF){if(a[0].h > a[0].w) swap(a[0].h, a[0].w);for(int i = 1; i < 6; ++i){scanf("%d%d", &a[i].h, &a[i].w);if(a[i].h > a[i].w) swap(a[i].h, a[i].w);}sort(a, a+6);if(ok()) puts("POSSIBLE");else puts("IMPOSSIBLE");}return 0;
}