您的位置:首页 > 其它

???习题3-10 UVa1587 Box

2015-11-13 21:39 295 查看
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;  //将与前面一个相等的赋值为0
break;
}
}
}
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: