算法竞赛入门经典 UVa1587Box

这题一定要好好说道说道。

这题第一次写的时候,我居然二到,只判断了两个面相等,当然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");
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值