Advertisement
Guest User

Untitled

a guest
Feb 21st, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.99 KB | None | 0 0
  1. #include <vector>
  2. #include <cstdio>
  3. #include <string>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. typedef struct rectangle{
  9.     int width,height;
  10.     bool horizontal,vertical,placed,first_placed_vertical,first_placed_horizontal;
  11.     int urc [2],ulc[2],brc[2],blc[2];
  12.  
  13.  
  14. }Rectangle;
  15.  
  16. typedef struct point{
  17.     int x,y,visited;
  18.  
  19. }Point;
  20.  
  21. bool check_intersection(Rectangle *array_rec,vector<Point> &possible_points,Point toplace,int rec,int orientation);
  22. bool place_rectangle(Rectangle *array_rec,vector<Point> &possible_points,Point toplace,int rec);
  23. int n_rectangles=0; /*nº de rectangulos no input*/
  24. long total_height=0,total_width=0;
  25. long area=0;
  26. bool solution(Rectangle *array_rec,vector<Rectangle> &array_col,int*solutions, long* area,vector<Point> &possible_points,vector <Point> &removed_points,int rec);
  27.  
  28. int main() {
  29.  
  30.     int solutions=0;
  31.     Rectangle* array_rec=new Rectangle[n_rectangles]; /* array que guarda as medidas de cada rectangulo*/
  32.     vector<Rectangle> array_col;
  33.     vector <Point> possible_points;
  34.     vector <Point> removed_points;
  35.     scanf("%d",&n_rectangles);
  36.     for(int i=0;i<n_rectangles;i++){
  37.         fscanf(stdin,"%d %d",&array_rec[i].width,&array_rec[i].height);
  38.         array_rec[i].placed=false;
  39.         array_rec[i].first_placed_vertical=false;
  40.         array_rec[i].first_placed_horizontal=false;
  41.         area += (array_rec[i].width * array_rec[i].height);
  42.     }
  43.     printf("Área Total:%ld\n",area);
  44.     solution(array_rec,array_col,&solutions,&area,possible_points,removed_points,0);
  45.     printf("%d",solutions);
  46.     return 0;
  47. }
  48.  
  49. void vertical_coordinates(Rectangle *array_rec,int sq,int blcx,int blcy) {
  50.     array_rec[sq].blc[0] = blcx;
  51.     array_rec[sq].blc[1] = blcy;
  52.     array_rec[sq].brc[0] = blcx+array_rec[sq].width;
  53.     array_rec[sq].brc[1] = blcy;
  54.     array_rec[sq].ulc[0] = blcx;
  55.     array_rec[sq].ulc[1] = blcy+array_rec[sq].height;
  56.     array_rec[sq].urc[0] = blcx+array_rec[sq].width;
  57.     array_rec[sq].urc[1] = blcy+array_rec[sq].height;
  58. }
  59.  
  60. void horizontal_coordinates(Rectangle *array_rec,int sq,int blcx,int blcy) {
  61.     array_rec[sq].blc[0] = blcx;
  62.     array_rec[sq].blc[1] = blcy;
  63.     array_rec[sq].brc[0] = blcx+array_rec[sq].height;
  64.     array_rec[sq].brc[1] = blcy;
  65.     array_rec[sq].ulc[0] = blcx;
  66.     array_rec[sq].ulc[1] = blcy+array_rec[sq].width;
  67.     array_rec[sq].urc[0] = blcx+array_rec[sq].height;
  68.     array_rec[sq].urc[1] = blcy+array_rec[sq].width;
  69. }
  70.  
  71. bool accept_solution(Rectangle* array_rec){
  72.  
  73.     for(int i=0;i<n_rectangles;i++){
  74.         if(!array_rec[i].placed){
  75.             return false;
  76.         }
  77.     }
  78.     return true;
  79. }
  80.  
  81. bool place_rectangle(Rectangle *array_rec,vector<Point> &possible_points,Point toplace,int rec){
  82.  
  83.     for(int x =0; x<(int)possible_points.size();x++){
  84.         if (possible_points[x].x==toplace.x && possible_points[x].y==toplace.y){
  85.             possible_points[x].visited+=1;
  86.         }
  87.     }
  88.     toplace.visited+=1;
  89.     printf("Rectangulo: %d\n",rec);
  90.     Rectangle aux_rec=array_rec[rec];
  91.     vertical_coordinates(array_rec, rec, toplace.x, toplace.y);
  92.     printf("To Place: %d %d\n", toplace.x, toplace.y);
  93.     if(check_intersection(array_rec,possible_points,toplace,rec,0)) {
  94.         Point ulc = {array_rec[rec].ulc[0], array_rec[rec].ulc[1],0};
  95.         Point brc = {array_rec[rec].brc[0], array_rec[rec].brc[1],0};
  96.         printf("Point ulc: %d %d Point brc: %d %d \n", ulc.x, ulc.y, brc.x, brc.y);
  97.         possible_points.push_back(ulc);
  98.         possible_points.push_back(brc);
  99.         for(int s=0;s<(int)possible_points.size();s++){
  100.             if(possible_points[s].x==toplace.x && possible_points[s].y==toplace.y){
  101.                 possible_points.erase(possible_points.begin()+s);
  102.             }
  103.         }
  104.         return true;
  105.     }
  106.     else {
  107.         printf("rodou\n");
  108.         printf("To Place Horiz: %d %d\n", toplace.x, toplace.y);
  109.         horizontal_coordinates(array_rec,rec,toplace.x,toplace.y);
  110.         if(check_intersection(array_rec,possible_points,toplace,rec,1)){
  111.  
  112.             Point ulc = {array_rec[rec].ulc[0], array_rec[rec].ulc[1],0};
  113.             Point brc = {array_rec[rec].brc[0], array_rec[rec].brc[1],0};
  114.             printf("Point ulc: %d %d Point brc: %d %d \n", ulc.x, ulc.y, brc.x, brc.y);
  115.             possible_points.push_back(ulc);
  116.             possible_points.push_back(brc);
  117.             for(int s=0;s<(int)possible_points.size();s++){
  118.                 if(possible_points[s].x==toplace.x && possible_points[s].y==toplace.y){
  119.                     possible_points.erase(possible_points.begin()+s);
  120.                 }
  121.             }
  122.  
  123.             return true;
  124.         }
  125.         array_rec[rec]=aux_rec;
  126.         return false;
  127.     }
  128. }
  129.  
  130. bool check_intersection(Rectangle *array_rec,vector<Point> &possible_points,Point toplace,int rec,int orientation){ /* orientation: 0 vertical 1 horizontal*/
  131.     for (int i = 0; i < (int) possible_points.size(); i++) {
  132.         if(orientation==0) {
  133.             if (toplace.x + array_rec[rec].width < possible_points[i].x && toplace.y + array_rec[rec].height < possible_points[i].y) {
  134.                 printf("false intercestion\n");
  135.                 return false;
  136.             }
  137.         }
  138.         else{
  139.             if (toplace.x + array_rec[rec].height < possible_points[i].x && toplace.y + array_rec[rec].width < possible_points[i].y) {
  140.                 printf("false intercestion\n");
  141.                 return false;
  142.             }
  143.         }
  144.  
  145.     }
  146.     long auxtotal_width=total_width;
  147.     long auxtotal_height=total_height;
  148.     if(total_height<array_rec[rec].ulc[1]){
  149.         auxtotal_height=array_rec[rec].ulc[1];
  150.     }
  151.  
  152.     if(total_width<array_rec[rec].brc[0]) {
  153.         auxtotal_width =array_rec[rec].brc[0];
  154.     }
  155.     printf("w %ld h %ld\n",auxtotal_width,auxtotal_height);
  156.     if((auxtotal_width)*auxtotal_height<=area){
  157.         total_width=auxtotal_width;
  158.         total_height=auxtotal_height;
  159.         return true;
  160.     }
  161.     else{
  162.         printf("false area \n");
  163.  
  164.         return false;
  165.     }
  166.  
  167. }
  168.  
  169. bool check_all_placed(Rectangle *array_rec){
  170.     int placed=0;
  171.     for(int i=0;i<n_rectangles;i++){
  172.         if(array_rec[i].placed){
  173.             placed++;
  174.         }
  175.     }
  176.     if(placed==n_rectangles){
  177.         return true;
  178.     }
  179.     else{
  180.         return false;
  181.     }
  182. }
  183.  
  184. bool all_rectangle_tested(Point point,vector<Rectangle> &array_col){
  185.     printf("Visitados do ponto %d %d: %d\n",point.x,point.y,point.visited);
  186.     if(point.visited==(n_rectangles-(int)array_col.size())){
  187.         printf("ALL TESTED TRUE %d %d\n",point.x,point.y);
  188.  
  189.         return  true;
  190.     }
  191.     printf("ALL FALSE %d %d\n",point.x,point.y);
  192.  
  193.     return false;
  194.  
  195. }
  196. bool solution(Rectangle *array_rec,vector<Rectangle> &array_col,int*solutions, long* area,vector<Point> &possible_points,vector <Point> &removed_points,int rec){
  197.     if(check_all_placed(array_rec)){ /*Solução encontrada*/
  198.         *solutions+=1;
  199.         possible_points.clear(); /*Reset */
  200.         array_col.clear();
  201.         for(int r=0;r<n_rectangles;r++){
  202.             array_rec[r].placed=false;
  203.         }
  204.         for(int j=0;j<n_rectangles;j++){
  205.             if(!array_rec[j].first_placed_vertical){
  206.                 array_rec[j].first_placed_vertical=true;
  207.                 printf("chamou func 0\n");
  208.                 return solution(array_rec,array_col,solutions,area,possible_points,removed_points,j);
  209.             }
  210.         }
  211.         return false;
  212.  
  213.     }
  214.  
  215.     if(rec==n_rectangles){
  216.         rec=0;
  217.         printf("chamou func 2\n");
  218.         return solution(array_rec,array_col,solutions,area,possible_points,removed_points,rec);
  219.     }
  220.  
  221.     if(array_rec[rec].placed){
  222.         printf("chamou func 3\n");
  223.         return solution(array_rec,array_col,solutions,area,possible_points,removed_points,rec+1);
  224.     }
  225.  
  226.     if(possible_points.empty()){
  227.         Point point={0,0};
  228.         place_rectangle(array_rec,possible_points,point,rec);
  229.         array_rec[rec].placed=true;
  230.         array_col.push_back(array_rec[rec]);
  231.         printf("chamou func 4\n");
  232.         return solution(array_rec,array_col,solutions,area,possible_points,removed_points,rec+1);
  233.     }
  234.     else{
  235.         int processed_points=0;
  236.         for(int i=0;i<(int)possible_points.size();i++){
  237.             if(place_rectangle(array_rec,possible_points,possible_points[i],rec)){
  238.                 array_rec[rec].placed=true;
  239.                 array_col.push_back(array_rec[rec]);
  240.                 printf("chamou func 5\n");
  241.                 return solution(array_rec,array_col,solutions,area,possible_points,removed_points,rec+1);
  242.  
  243.             }
  244.             else{
  245.                 processed_points++;
  246.                 if(all_rectangle_tested(possible_points[i],array_col)){
  247.                     removed_points.push_back(possible_points[i]);
  248.                     possible_points.erase(possible_points.begin()+i);
  249.                     array_rec[rec].placed=false;
  250.                     printf("chamou func 6\n");
  251.                     return solution(array_rec,array_col,solutions,area,possible_points,removed_points,rec);
  252.  
  253.                 }
  254.  
  255.             }
  256.         }
  257.         if(processed_points==(int)possible_points.size()){
  258.             for(int l=0;l<(int)removed_points.size();l++) {
  259.                 if (array_rec[rec].blc[0]==removed_points[l].x && array_rec[rec].blc[1]==removed_points[l].y && array_rec[rec].placed){
  260.                     if(!all_rectangle_tested(removed_points[l],array_col)){
  261.                         printf("TODOS TESTADOS NO PONTO %d %d\n",removed_points[l].x,removed_points[l].y);
  262.                         possible_points.push_back(removed_points[l]);
  263.                     }
  264.                 }
  265.             }
  266.                 for(int k=0;k<n_rectangles;k++){
  267.                 if(array_rec[k].blc==array_col.back().blc){
  268.                     array_rec[k].placed=false;
  269.                 }
  270.             }
  271.             array_col.pop_back();
  272.             printf("chamou func 7\n");
  273.             return solution(array_rec,array_col,solutions,area,possible_points,removed_points,rec);
  274.  
  275.         }
  276.     }
  277.     return false;
  278. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement