《算法竞赛入门经典》UVA1587

《算法竞赛入门经典》UVA1587

 

博主解题思路

  排除所有错误的可能性
  根据这种思路,我写了第一版的code,被WA了。
  具体原因是对可能出现的错误考虑不完全。
  这里有几类可以尝试的数据,被WA的朋友可以看一看。
 

1 2
1 3
1 4
1 3
2 3
2 3
// IMPOSSIBLE

最基础的数据,出现了四个值,如果这组数据出错的话,题目所给的测试数据也会报错。
 

1 1
1 1
1 1
1 1
1 1
1 1
// POSSIBLE

第二种错误,判断时摘除了立方体
 

1 1
1 1
1 2
1 2
2 2
2 2
//IMPOSSIBLE

第三种错误,12个数据中每个数据出现的次数不为4的倍数
 

1 1
1 1
2 2
2 2
3 3
3 3
// IMPOSSIBLE

第四种错误,上述数据有三组对面,但无法构成立方体。
 

1 2
1 1
1 2
2 3
2 3
3 3
// IMPOSSIBLE

第五种错误,上述数据只构成了两组对面,博主就是挂在这组数据上了
 

博主WA code

#include <cstdio>
using namespace std;

int A,B,C,An,Bn,t,tt,count = 0;
int array[6][2];

int very(){
    A = array[0][0];
    B = array[0][1];						//解决第四种错误出现的可能性
    if (A == B) An = An+2;					//解决第二种错误出现的可能性
    else {Bn++;An++;}
    for (int i = 1;i<6;i++){
        t = array[i][0];
        tt = array[i][1];
        if (!C&&t!=A&&t!=B) C=t;
        else if (!C&&tt!=A&&tt!=B) C=tt;	//找出C

        if (t==A)An++;
        else if (t==B) Bn++;
        else if (t!=C)return 0;				//解决第一种错误出现的可能性

        if (tt==A)An++;
        else if (tt==B) Bn++;
        else if (tt!=C)return 0;			//解决第一种错误出现的可能性
    }
    if (An%4||Bn%4)return 0;				//解决第三种错误出现的可能性
    return 1;
}

int main(){
    while(scanf("%d%d",&array[count][0],&array[count][1])!=EOF){
    	count++;
        if (count == 6){
            very()? printf("POSSIBLE\n"):printf("IMPOSSIBLE\n");;
            count = 0;
            An = 0;Bn = 0;
        }
    }
}

 
 

大神题解

思路:对所有边进行sort处理,形成ab ab ac ac bc bc 的序列 (a<=b<=c)
然后按照序列写六个判断

#include<iostream>
#include<stdio.h>
using namespace std;
#define rep(i,t,n)  for(int i =(t);i<=(n);++i)
#define x first
#define y second
pair<int, int> a[7];
int main() {
    while (cin >> a[1].x >> a[1].y){
        rep(i, 2, 6)scanf("%d%d", &a[i].x, &a[i].y);
        rep(i, 1, 6)if(a[i].x>a[i].y)swap(a[i].x,a[i].y);
        sort(a + 1, a + 7);
        puts(a[1] == a[2] && a[3] == a[4] && a[5] == a[6] && a[1].x==a[3].x&&a[3].y==a[5].y&&a[5].x==a[1].y?"POSSIBLE":"IMPOSSIBLE");
	}
}
// 转载自Suut 博客园 https://www.cnblogs.com/SuuT/p/9445636.html
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值