Ural 1437

来源:互联网 发布:手机淘宝怎么找主播 编辑:程序博客网 时间:2024/05/21 07:10

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 360struct 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_JUDGEfreopen("in.txt","r",stdin);#endifwhile(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->bv=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->av=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->cv=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->av=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->cv=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;}


原创粉丝点击