hdu 2405

想法很简单:宽搜。

问题是:如果得不到结果,怎么终止?我的笨办法是,当ed超过一定数目,如990时,就判断无法得到。这样也能过……


#include "stdio.h"

typedef struct _Bskt{
	int a, b, c;
	int pre;
}Bskt, *pBskt;

Bskt bskt[1000];
int st, ed;

int BFS(int a, int b, int c){
	Bskt k;
	if(a == b && b == c) return -1;
	if((a+b+c)%3) return -1;
	bskt[0].a = a;
	bskt[0].b = b;
	bskt[0].c = c;
	bskt[0].pre = -1;
	st = 0; ed = 1;

	while(st<ed){
		if(ed>990) return -1;
		k = bskt[st];
		//a
		if(k.b>=k.a && !(k.a+k.a==a && k.b-k.a==b && k.c==c)){
			bskt[ed].a = k.a + k.a;
			bskt[ed].b = k.b - k.a;
			bskt[ed].c = k.c;
			bskt[ed].pre = st;
			if(bskt[ed].a == bskt[ed].b && bskt[ed].b == bskt[ed].c) return ed;	
			ed++;
		}
		if(k.c>=k.a && !(k.a+k.a==a && k.b==b && k.c-k.a==c)){
			bskt[ed].a = k.a + k.a;
			bskt[ed].b = k.b;
			bskt[ed].c = k.c - k.a;
			bskt[ed].pre = st;
			if(bskt[ed].a == bskt[ed].b && bskt[ed].b == bskt[ed].c) return ed;
			ed++;
		}
		//b
		if(k.a>=k.b && !(k.a-k.b==a && k.b+k.b==b && k.c==c)){
			bskt[ed].a = k.a - k.b;
			bskt[ed].b = k.b + k.b;
			bskt[ed].c = k.c;
			bskt[ed].pre = st;
			if(bskt[ed].a == bskt[ed].b && bskt[ed].b == bskt[ed].c) return ed;
			ed++;
		}
		if(k.c>=k.b && !(k.a==a && k.b+k.b==b && k.c-k.b==c)){
			bskt[ed].a = k.a;
			bskt[ed].b = k.b + k.b;
			bskt[ed].c = k.c - k.b;
			bskt[ed].pre = st;
			if(bskt[ed].a == bskt[ed].b && bskt[ed].b == bskt[ed].c) return ed;
			ed++;
		}
		//c
		if(k.a>=k.c && !(k.a-k.c==a && k.b==b && k.c+k.c==c)){
			bskt[ed].a = k.a - k.c;
			bskt[ed].b = k.b;
			bskt[ed].c = k.c + k.c;
			bskt[ed].pre = st;
			if(bskt[ed].a == bskt[ed].b && bskt[ed].b == bskt[ed].c) return ed;
			ed++;
		}
		if(k.b>=k.c && !(k.a==a && k.b-k.c==b && k.c+k.c==c)){
			bskt[ed].a = k.a;
			bskt[ed].b = k.b - k.c;
			bskt[ed].c = k.c + k.c;
			bskt[ed].pre = st;
			if(bskt[ed].a == bskt[ed].b && bskt[ed].b == bskt[ed].c) return ed;
			ed++;
		}
		st++;
	}

	return -1;
}

void display(int pre){
	if(pre==-1)
		return;
	display(bskt[pre].pre);
	printf("%4d %3d %3d\n", bskt[pre].a, bskt[pre].b, bskt[pre].c);
}

void main(){
	int a, b, c, k;
	freopen("in.txt", "r", stdin);
	while(scanf("%d %d %d", &a, &b, &c)!=EOF){
		if((k=BFS(a, b, c))>=0)
			display(k);
		else
			printf("%4d %3d %3d\n", a, b, c);
		printf("============\n");
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值