Advertisement
Guest User

Untitled

a guest
Feb 18th, 2018
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.67 KB | None | 0 0
  1. #include <cstdio>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. typedef struct rectangle{
  7.     int width,height;
  8.     bool horizontal=false,vertical= false,placed=false;
  9.     int urc [2],ulc[2],brc[2],blc[2];
  10.  
  11. }Rectangle;
  12.  
  13. typedef struct point{
  14.     int x,y;
  15. }Point;
  16. void vertical_coordinates(Rectangle *array_rec, int sq,int blcx,int blcy);
  17. void horizontal_coordinates(Rectangle *array_rec, int sq,int blcx,int blcy);
  18. void possibilities(Rectangle *array_rec,int n_rectangles, int*solutions, long* area,vector<Point> &occupied_points,int num_inits,int i);
  19. long total_height=0,total_width=0;
  20. int init_times=0;
  21.  
  22. int main() {
  23.  
  24.     long area=0;
  25.  
  26.     int solutions=0;
  27.     int n_rectangles=0; /*nº de rectangulos no input*/
  28.     vector <Point> occupied_points;
  29.  
  30.     scanf("%d",&n_rectangles);
  31.     Rectangle array_rec[n_rectangles]; /* array que guarda as medidas de cada rectangulo*/
  32.     for(int i=0;i<n_rectangles;i++){
  33.         fscanf(stdin,"%d %d",&array_rec[i].width,&array_rec[i].height);
  34.         if(array_rec[i].width==array_rec[i].height){
  35.             init_times++;
  36.         }
  37.         else{
  38.             init_times+=2;
  39.             printf("init %d",init_times);
  40.         }
  41.         area+=(array_rec[i].width*array_rec[i].height);
  42.  
  43.     }
  44.     printf("area:%ld",area);
  45.  
  46.     possibilities(array_rec,n_rectangles,&solutions,&area,occupied_points,0,0);
  47.     printf("%d",solutions);
  48.     return 0;
  49. }
  50.  
  51. void vertical_coordinates(Rectangle *array_rec, int sq,int blcx,int blcy) {
  52.     array_rec[sq].blc[0] = blcx;
  53.     array_rec[sq].blc[1] = blcy;
  54.     array_rec[sq].brc[0] = array_rec[0].width;
  55.     array_rec[sq].brc[1] = blcy;
  56.     array_rec[sq].ulc[0] = blcx;
  57.     array_rec[sq].ulc[1] = array_rec[0].height;
  58.     array_rec[sq].urc[0] = array_rec[0].width;
  59.     array_rec[sq].urc[1] = array_rec[0].height;
  60. }
  61.  
  62. void horizontal_coordinates(Rectangle *array_rec, int sq,int blcx,int blcy) {
  63.     array_rec[sq].blc[0] = blcx;
  64.     array_rec[sq].blc[1] = blcy;
  65.     array_rec[sq].brc[0] = array_rec[0].height;
  66.     array_rec[sq].brc[1] = blcy;
  67.     array_rec[sq].ulc[0] = blcx;
  68.     array_rec[sq].ulc[1] = array_rec[0].width;
  69.     array_rec[sq].urc[0] = array_rec[0].height;
  70.     array_rec[sq].urc[1] = array_rec[0].width;
  71. }
  72.  
  73.  
  74. void possibilities(Rectangle *array_rec,int n_rectangles, int*solutions, long* area,vector<Point> &occupied_points,int num_inits,int i) {
  75.  
  76.     if(num_inits==init_times){
  77.         return;
  78.     }
  79.     int placed=0;
  80.     for(int s=0;s<n_rectangles;s++){
  81.         if(array_rec[s].placed){
  82.             placed++;
  83.             array_rec[s].placed=false;
  84.         }
  85.     }
  86.     if(placed==n_rectangles){
  87.         num_inits=0;
  88.         i=0;
  89.         *solutions+=1;
  90.     }
  91.     if (n_rectangles == 1){
  92.         if (array_rec[0].height == array_rec[0].width){
  93.             *solutions = 1;
  94.             return;
  95.         }
  96.         else{
  97.             *solutions=2;
  98.             return;
  99.         }
  100.     }
  101.     else {
  102.             if(!array_rec[i].vertical){
  103.                 if(occupied_points.empty()) {
  104.                     if(array_rec[i].vertical){
  105.                         array_rec[i].horizontal=true;
  106.                         horizontal_coordinates(array_rec,i,0,0);
  107.  
  108.                     }
  109.                     else {
  110.                         array_rec[i].vertical = true;
  111.  
  112.                         vertical_coordinates(array_rec, i,0,0);
  113.                     }
  114.                     Point point1={array_rec[i].ulc[0],array_rec[i].ulc[1]};
  115.                     Point point2={array_rec[i].brc[0],array_rec[i].brc[1]};
  116.                     occupied_points.push_back(point1);
  117.                     occupied_points.push_back(point2);
  118.                     total_height+=array_rec[i].height;
  119.                     total_width+=array_rec[i].width;
  120.                     array_rec[i].placed=false;
  121.                     possibilities(array_rec,n_rectangles,solutions,area,occupied_points,num_inits+1,i+1);
  122.  
  123.  
  124.                 }
  125.                 else{
  126.                     for(int j=0;j<(int)occupied_points.size();j++) {
  127.                         if((total_height+array_rec[i].height)*(total_width)<*area)  {
  128.                             vertical_coordinates(array_rec, i, occupied_points.at((unsigned long)j).x,occupied_points.at((unsigned long)j).y);
  129.                             array_rec[i].vertical=true;
  130.                             total_height+=array_rec[i].height;
  131.                             occupied_points.erase(occupied_points.begin()+j);
  132.                             Point point1={array_rec[i].ulc[0],array_rec[i].ulc[1]};
  133.                             Point point2={array_rec[i].brc[0],array_rec[i].brc[1]};
  134.                             occupied_points.push_back(point1);
  135.                             occupied_points.push_back(point2);
  136.                             possibilities(array_rec,n_rectangles,solutions,area,occupied_points,num_inits,i+1);
  137.  
  138.                         }
  139.                         else if((total_width+array_rec[i].width)*(total_height)<*area)  {
  140.                             horizontal_coordinates(array_rec, i, occupied_points.at((unsigned long)j).x,occupied_points.at((unsigned long)j).y);
  141.                             array_rec[i].horizontal=true;
  142.                             total_width+=array_rec[i].width;
  143.                             occupied_points.erase(occupied_points.begin()+j);
  144.                             bool add=true;
  145.                             Point point1={array_rec[i].ulc[0],array_rec[i].ulc[1]};
  146.  
  147.                             for(int h=0;h<(int)occupied_points.size();h++){
  148.                                 if(occupied_points.at((unsigned long)h).x==point1.x || occupied_points.at((unsigned long)h).y==point1.y){
  149.                                     add=false;
  150.                                     break;
  151.                                 }
  152.                             }
  153.                             if(add){
  154.                                 occupied_points.push_back(point1);
  155.  
  156.                             }
  157.                             Point point2={array_rec[i].brc[0],array_rec[i].brc[1]};
  158.                             for(int h=0;h<(int)occupied_points.size();h++){
  159.                                 if(occupied_points.at((unsigned long)h).x==point2.x || occupied_points.at((unsigned long)h).y==point2.y){
  160.                                     add=false;
  161.                                     break;
  162.                                 }
  163.                             }
  164.                             if(add){
  165.                                 occupied_points.push_back(point2);
  166.  
  167.                             }
  168.                             possibilities(array_rec,n_rectangles,solutions,area,occupied_points,num_inits,i+1);
  169.                         }
  170.                     }
  171.                 }
  172.             }
  173.         }
  174.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement