UVA1587 BOX//紫书习题j-box

UVA1587 BOX//紫书习题j-box_第1张图片
这道题来自UVA,上面是原题

大概题意:
给出六个面判断这六个面是否能构成长方体
输入:
每个面的长宽
输出:
POSSIBLE或IMPOSSIBLE
我的基本思路是先排序后根据条件判断。
假设三个数a>b>c,如果这三个数能构成一个长方体,那么排序后这三个数所组成的六个面以此应该是:
ab ab ac ac bc bc
这样再根据构成长方体的条件(a,b,c所对应位置值相等)判断即可。

以下是我AC的代码(有点长,哈哈哈)

#include
void swap(int *a,int *b)
{
    int t;
    t=*a;
    *a=*b;
    *b=t;
}
int main()
{
    int a[6],b[6],flag,i,j;
    while(scanf("%d%d",&a[0],&b[0])!=EOF)
    {
        if(a[0]>b[0])
            swap(&a[0],&b[0]);
        for(i=1;i<=5;i++)
        {
            scanf("%d%d",&a[i],&b[i]);
            if(a[i]>b[i])
                swap(&a[i],&b[i]);
        }
        //到这儿每个面的长宽都是宽在前
            flag=1;
       ///按照ab ab ac ac bc bc 排序
        for(i=0;i<6;i++)
           {
               for(j=i;j<6;j++)
               {
                   if(a[i]>a[j])
                   {
                       swap(&a[i],&a[j]);
                       swap(&b[i],&b[j]);
                   }
                   else if(a[i]==a[j]&&b[i]>b[j])
                   {
                       swap(&b[i],&b[j]);
                   }
               }
           }
        //
	   //判断是否为三个完全一样的对面
        for(i=0;i<6;i+=2)
        {
            if(a[i]!=a[i+1]||b[i]!=b[i+1])
            {
                flag=0;
                break;
            }
        }
        
        if(flag)
        {
            if(a[0]!=a[2]||a[4]!=b[0]||b[2]!=b[4])//判断对应位置的值是否相等
                flag=0;
        }
        if(flag)
            printf("POSSIBLE\n");
        else
            printf("IMPOSSIBLE\n");
    }
    return 0;
}

最后总结下我所犯的错误

  1. 在排序时未将a[0],b[0]排序
  2. 在后面排序时开始是先按照a数组排序,然后按照b数组排序。想要达到效果忽略了在按照b数组排序时会打乱排好了的a。
  3. 在拼写IMPOSSIBLE时未采用复制手段,导致卡在这个地方一直WA。

这道题个人认为重点是在排序。为了交换方便我就采用了交换函数,开始未用指针就不能将值传回主函数。

以上仅供参考

你可能感兴趣的:(c语言)