Ural 1437

31 篇文章 0 订阅

I HATE THIS PROBLEM!!! 


I just write a BF solution  like this:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<math.h>
#include<queue>

using namespace std;

#define sf scanf
#define pf printf
#define rep(i,n) for(int (i)=0;(i)<(n);(i)++)
#define ll long long
#define CLR(a) memset((a),0,sizeof((a)))
#define bug(x) cerr << "line: " << __LINE__ << ' ' << #x << " = " << (x) << endl;
#define nMax 360

struct T1{
	int a,b,c;
	T1() {}
	T1(int a,int b,int c):a(a),b(b),c(c){}
	void out() { cout << a << ' ' << b << ' ' << c << endl; }
};

queue<T1> que;
bool vis[nMax][nMax][nMax];
int a,b,c;
int ok[nMax*nMax];

int main() {
#ifndef ONLINE_JUDGE
	freopen("in.txt","r",stdin);
#endif
	
	while(cin >> a >> b >> c) {
		CLR(vis);
		while(!que.empty()) que.pop();
		que.push(T1(a,0,0)),vis[a][0][0]=1;
		que.push(T1(a,b,0)),vis[a][b][0]=1;
		que.push(T1(a,b,c)),vis[a][b][c]=1;
		que.push(T1(0,b,0)),vis[0][b][0]=1;
		que.push(T1(0,b,c)),vis[0][b][c]=1;
		que.push(T1(0,0,c)),vis[0][0][c]=1;
		int e,f,g;
		T1 u,v;
		while(!que.empty()){
			u = que.front();que.pop();
			e = u.a; f = u.b; g = u.c;
			v=u;v.b = (e+f);if(v.b>b)v.b=b; v.a=e-(b-f);if(v.a<0) v.a =0; rep(z,2){if(!vis[v.a][v.b][v.c]) { vis[v.a][v.b][v.c]=1;que.push(v);}v.a=0;} // a->b
			v=u;v.a = (e+f);if(v.a>a)v.a=a; v.b=f-(a-e);if(v.b<0) v.b =0; rep(z,2){if(!vis[v.a][v.b][v.c]) { vis[v.a][v.b][v.c]=1;que.push(v);}v.b=0;} // b->a
			v=u;v.c = (e+g);if(v.c>c)v.c=c; v.a=e-(c-g);if(v.a<0) v.a =0; rep(z,2){if(!vis[v.a][v.b][v.c]) { vis[v.a][v.b][v.c]=1;que.push(v);}v.a=0;} // a->c
			v=u;v.a = (e+g);if(v.a>a)v.a=a; v.c=g-(a-e);if(v.c<0) v.c =0; rep(z,2){if(!vis[v.a][v.b][v.c]) { vis[v.a][v.b][v.c]=1;que.push(v);}v.c=0;} // c->a
			v=u;v.c = (g+f);if(v.c>c)v.c=c; v.b=f-(c-g);if(v.b<0) v.b =0; rep(z,2){if(!vis[v.a][v.b][v.c]) { vis[v.a][v.b][v.c]=1;que.push(v);}v.b=0;} // b->c
			v=u;v.b = (g+f);if(v.b>b)v.b=b; v.c=g-(b-f);if(v.c<0) v.c =0; rep(z,2){if(!vis[v.a][v.b][v.c]) { vis[v.a][v.b][v.c]=1;que.push(v);}v.c=0;} // b->c
		}
		CLR(ok);
		for(int i=0;i<=a;i++) for(int j=0;j<=b;j++) for(int k=0;k<=c;k++) if(vis[i][j][k]) {
			ok[i]=1;
			ok[j]=1;
			ok[k]=1;
			ok[i+j]=1;
			ok[i+b]=1;
			ok[i+c]=1;
			ok[i+b+c]=1;
			ok[j+a]=1;
			ok[j+c]=1;
			ok[j+a+c]=1;
			ok[k+a]=1;
			ok[k+b]=1;
			ok[k+a+b]=1;
			ok[i+k]=1;
			ok[j+k]=1;
			ok[i+j+k]=1;
		}
		int num = 0;
		for(int i=a+b+c;i>0;i--) if(ok[i]) { num ++; }
		cout << num << endl;
		//break;
	}


	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值