???习题3-10 UVa1587 Box

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值