这题一定要好好说道说道。
这题第一次写的时候,我居然二到,只判断了两个面相等,当然WA。调整之后,一直还是WA,接下来,BUG就找了很久都没有找到,第二天又花了很久时间再看,又修改了几次输入格式,怀疑我的输入格式有问题,最终找到的问题是:我只判断了第一条,第二条是4的,倍数,第三条没有判断,因为我原本以为,前面两条满足之后,第三条就自动是了。
下面是我自己的代码:
#include<stdio.h>
#include<string.h>
int mian[6][2],flag[6];
int main()
{
while(~scanf("%d%d",&mian[0][0],&mian[0][1]))
{
for(int i =1;i<6;i++)
for(int j =0;j<2;j++)
scanf("%d",&mian[i][j]);
memset(flag,0,sizeof(flag));
int t;
for(int i = 0;i<6;i++)//使较小的数在前面
if(mian[i][0]>mian[i][1])
{
t= mian[i][0];
mian[i][0]= mian[i][1];
mian[i][1]=t;
}
for(int i =0;i<6;i++)//是否两两相对
for(int j =i+1;j<6;j++)
{
if(mian[i][0]==mian[j][0] && mian[i][1]==mian[j][1])
{
if(flag[i] ==0)
flag[i]++;
else break;
if(flag[j] ==0)
flag[j]++;
else continue;
}
else continue;
}
int i;
for( i=0;i<6;i++)//检查flag是否全为1
if(flag[i] != 1)
break;
int p=0,q=0,m =0,n =0,k=0;
int a =0,s,r =0;
for(int f = 0;f < 6;f++)
for(int t = 0;t < 2;t++)
{
p=mian[0][0];
if(mian[f][t] == p)
q++;
else
{
if(k==0)
{
m=mian[f][t]; k=1;
}
if(mian[f][t] == m)
n++;
else
if(a==0)
{
s=mian[f][t]; a=1;
}
if(mian[f][t] == s)
r++;
}
}
if(i ==6)
{
if(((q==4)||(q==8)||(q==12))&&((n==0)||(n==4)||(n==8))&&((r==0)||(r==4)))
printf("POSSIBLE\n");
else
printf("IMPOSSIBLE\n");
}
else
printf("IMPOSSIBLE\n");
}
return 0;
}
下面是我拜托同学写的,也AC了
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<map>
#define repf(i,a,b) for(int i=(a);i<=(b);i++)
using namespace std;
struct Nod{
int a,b;
friend bool operator <(Nod a,Nod b){
if(a.a==b.a)return a.b<b.b;
return a.a<b.a;
}
}p[6];
int main(){
while(~scanf("%d %d",&p[0].a,&p[0].b)){
map<int ,int >mp;
mp[p[0].a]++;
mp[p[0].b]++;
repf(i,1,5){
scanf("%d %d",&p[i].a,&p[i].b);
mp[p[i].a]++;
mp[p[i].b]++;
}
repf(i,0,5){
if(p[i].a>p[i].b)swap(p[i].a,p[i].b);
}
bool flag=true;
sort(p,p+6);
repf(i,0,4){
if(p[i].a==p[i+1].a&&p[i].b==p[i+1].b&&!(mp[p[i].a]%4||mp[p[i].b]%4)){
i++;
}
else{
flag=false;
break;
}
}
if(flag)puts("POSSIBLE");
else puts("IMPOSSIBLE");
}
}