1597 BOX (UVA)

目录

思路:

代码实现:

学习到的东西:


思路:

6 个矩形能够拼成一个长方体,则它的边的长度可能有三种:
有 3 种边长:一般的长方体
有 2 种边长:底面为正方形的长方体
有 1 种边长:正方体

代码实现:

最开始写的:

#include<stdio.h>
#include<string.h>
int s[10005][10005];

int main(){
    int a,b;
    while(scanf("%d %d",&a,&b)!=EOF)
    {
        memset(s,0,sizeof(s)); //二维数组的初始化
        int cnt=0;
        //统计个数①
        if(a>b)
        {
            s[b][a]++;
        }
        else
        {
            s[a][b]++;
        }
        //统计个数②
        for(int i=0;i<5;i++)
        {
            scanf("%d %d",&a,&b);
            if(a>b)
            {
                s[b][a]++;
                if(s[b][a]==2) cnt++;
                if(s[b][a]==4) cnt+=4;
                if(s[b][a]==6&&a==b) cnt=6;
            }
            else
            {
                s[a][b]++;
                if(s[a][b]==2) cnt++;
                if(s[a][b]==4) cnt+=4;
                if(s[a][b]==6&&a==b) cnt=6;
            }
        }
        //输出结果
        if(cnt==3||cnt==6) printf("POSSIBLE\n");
        else  printf("IMPOSSIBLE\n");
    }
    return 0;
}

提交显示答案错误,但是我所有的情况都考虑了啊?!!

其实,我虽然考虑了所有情况,但没有去考虑它的数学性质

当输入的数据为:

6666 4444
6666 4444
1234 4321
1234 4321
1234 4321
1234 4321

明显不能构成长方体,但是我的程序给的是possile

重新写了一次,利用指针变量对函数进行了优化,原理如下

一定要注意以下几点:

int *pa也可以写成int* pa

pa的值是存放的地址,*pa的值是它所存放的地址存放的值

int *pa=&a不是说*pa=&a,而是pa=&a

*pa=*pb的意思是,在不改变地址的情况下,让pa这个地址指向的值等于pb指向的值

#include<stdio.h>
//利用指针,写一个对两个数排序的函数,使大的在前,小的在后
int max(int *pa,int *pb)
{
    int t;
    if(*pa<*pb)
    {
        t=*pa;
        *pa=*pb;
        *pb=t;
    }
}

int main()
{
    int a,b;
    scanf("%d %d",&a,&b);
    max(&a,&b);
    printf("%d %d",a,b);
    return 0;
}

AC码

#include<iostream>
#include<string.h>
using namespace std;
int max(int *pa,int *pb);
int s[10005][10005];
int main()
{
    int a,b;
    while(scanf("%d %d",&a,&b)!=EOF)
    {
        int cnt=0; //cnt用来判断是否能够构成长方形
        int k=0,c[10005]; //用这两个东西用来统计边的种类
        memset(c,0,sizeof(c));
        memset(s,0,sizeof(s));
        //对第一次输入进行处理
        max(&a,&b);
        if(c[a]==0) { k++;  c[a]++; }
        if(c[b]==0) { k++;  c[b]++; }
        s[a][b]++;
        //对接下来的输入进行处理
        for(int i=0;i<5;i++)
        {
            scanf("%d %d",&a,&b);
            max(&a,&b);
            if(c[a]==0) { k++;  c[a]++; }
            if(c[b]==0) { k++;  c[b]++; }
            s[a][b]++;
                //对每组长和宽进行统计
                if(s[a][b]==2) cnt++;
                if(s[a][b]==4) cnt+=4;
                if(s[a][b]==6&&a==b) cnt=6;
        }
        //输出
        if((cnt==3||cnt==6)&&k<4) printf("POSSIBLE\n");
        else printf("IMPOSSIBLE\n");
    }
    return 0;
}

int max(int *pa,int *pb)
{
    int t;
    if(*pa<*pb) { t=*pa; *pa=*pb; *pb=t; }
    return 0;
}

学习到的东西:

为什么大数组要定义在main函数外

怎样初始化二维数组

猜你喜欢

转载自blog.csdn.net/qq_59414507/article/details/121300871
Box
今日推荐