目录
思路:
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;
}