Wednesday, July 21, 2010

ACM-102 Ecological Bin Packing with C++


#include<iostream>
#include<stdio.h>
#include<cstdio>

using namespace std;
string funct(int c1 , int c2 , int c3 , string s_temp , int temp , int temp_max);

 /********************************/
 /* glass[a][b]                  */
 /* a is bucket number           */
 /* b is glass color             */
 /* b = 1 Brown                  */
 /* b = 2 Green                  */
 /* b = 3 Clean                  */
 /********************************/
   


int main(int argc, char* argv[])
{
 unsigned int Bucket[3][3];
 int can_1, can_2, can_3;
 
 while (scanf("%d %d %d %d %d %d %d %d %d", &Bucket[0][0], &Bucket[0][1],
                                            &Bucket[0][2], &Bucket[1][0],
                                            &Bucket[1][1], &Bucket[1][2],
                                            &Bucket[2][0], &Bucket[2][1],
                                            &Bucket[2][2]) != EOF)
 {
  /* initiate */
  unsigned int max = 0 , move = 0;
  int init = 0, total = 0, temp_total = 0;
  string s_goal = "XXX";
  for(int i=0 ; i<3 ; i++)
  {
   for(int j=0 ; j<3 ; j++)
   {
    total = total + Bucket[i][j];
   }
  }
  
  for(can_1=0 ; can_1<3 ; can_1++)
  {
   init = Bucket[0][can_1];
   temp_total =  Bucket[0][can_1];
   for(can_2=0 ; can_2<3 ; can_2++)
   {
    if(can_1 != can_2)
    {
     temp_total = temp_total + Bucket[1][can_2];
     for(can_3=0 ; can_3<3 ; can_3++)
     {
      if( (can_3 != can_2) && (can_3 != can_1) )
      {
       temp_total = temp_total + Bucket[2][can_3];
       if(temp_total >= max)
       {
        s_goal = funct(can_1 , can_2 , can_3 , s_goal , temp_total , max);
        max = temp_total;
       }
       temp_total = init;
      }
     }
    }
   }
         
  }
  
  move = total - max;
  cout<< s_goal << " " << move <<endl;
 }
 
 return 0;
}


string funct(int c1 , int c2 , int c3 , string s_temp , int temp , int temp_max)
{
 string str="";
 int size = 0;

 if(c1==0){  
  str=str+"B";  
 }else if(c1==1){  
  str=str+"G";  
 }else 
  str=str+"C";  
     
 if(c2==0){  
  str=str+"B";  
 }else if(c2==1){  
  str=str+"G";  
 }else 
  str=str+"C";     
      
 if(c3==0){  
  str=str+"B";  
 }else if(c3==1){  
  str=str+"G";  
 }else 
  str=str+"C";
  
 if(temp == temp_max)
 {
  while(size < 2)
  {
   if(str[size] < s_temp[size])
    return str;
   else if(str[size] > s_temp[size])
    break;
   else
    size++;
  }  
  return s_temp;
 }   
 
 return str;
}

No comments: