Advertisement
Guest User

Triangulos 2

a guest
Feb 18th, 2020
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.89 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. void clone_matrix(int n, int m, int matrix1[][m], int matrix2[][m])
  6. {
  7.     for (int i = 0; i < n; i++)
  8.     {
  9.         for (int j = 0; j < m; j++)
  10.         {
  11.             matrix2[i][j] = matrix1[i][j];
  12.         }
  13.        
  14.     }
  15. }
  16.  
  17. int count(int n, int m, int matrix[][m], int k, int counter)
  18. {
  19.     for (int i = 0; i < n; i++)
  20.     {
  21.         for (int j = 0; j < m; j++)
  22.         {
  23.             if (matrix[i][j] == k)
  24.             {
  25.                 counter++;
  26.             }
  27.                
  28.         }
  29.     }
  30.     return counter;
  31. }
  32.  
  33. void read_matrix(int n, int m, int matrix[][m], int i, int j)
  34. {
  35.     if (i == n)
  36.     {
  37.         return;
  38.     }
  39.    
  40.     scanf("%d", &matrix[i][j]);
  41.  
  42.     j++;
  43.     if (j == m)
  44.     {
  45.         j = 0;
  46.         i++;
  47.     }
  48.     read_matrix(n, m, matrix, i, j);
  49. }
  50.  
  51. int check_triangle_up(int n, int m, int matrix[n][m], int start, int end, int i, int bin)
  52. {
  53.     start++;
  54.     if (start >= m)
  55.     {
  56.         return 0;
  57.     }
  58.     end--;
  59.     if (end < 0)
  60.     {
  61.         return 0;
  62.     }
  63.     i--;
  64.     if (i < 0)
  65.     {
  66.         return 0;
  67.     }
  68.  
  69.     if (start == end)
  70.     {
  71.         if (matrix[i][start] == bin)
  72.         {
  73.             return 1;
  74.         }
  75.         return 0;
  76.     }
  77.  
  78.     for (int c = start; c <= end; c++)
  79.     {
  80.         if (matrix[i][c] != bin)
  81.         {
  82.             return 0;
  83.         }
  84.     }
  85.  
  86.     return check_triangle_up(n, m, matrix, start, end, i, bin);
  87. }
  88.  
  89. int check_triangle_down(int n, int m, int matrix[n][m], int start, int end, int i, int bin)
  90. {
  91.     start++;
  92.     if (start >= m)
  93.     {
  94.         return 0;
  95.     }
  96.     end--;
  97.     if (end < 0)
  98.     {
  99.         return 0;
  100.     }
  101.     i++;
  102.     if (i >= n)
  103.     {
  104.         return 0;
  105.     }
  106.  
  107.     if (start == end)
  108.     {
  109.         if (matrix[i][start] == bin)
  110.         {
  111.             return 1;
  112.         }
  113.         return 0;
  114.     }
  115.  
  116.     for (int c = start; c <= end; c++)
  117.     {
  118.         if (matrix[i][c] != bin)
  119.         {
  120.             return 0;
  121.         }
  122.     }
  123.  
  124.     return check_triangle_down(n, m, matrix, start, end, i, bin);
  125. }
  126.  
  127. int check_triangle_left(int n, int m, int matrix[n][m], int start, int end, int j, int bin)
  128. {
  129.     start++;
  130.     if (start >= n)
  131.     {
  132.         return 0;
  133.     }
  134.     end--;
  135.     if (end < 0)
  136.     {
  137.         return 0;
  138.     }
  139.     j--;
  140.     if (j < 0)
  141.     {
  142.         return 0;
  143.     }
  144.  
  145.     if (start == end)
  146.     {
  147.         if (matrix[start][j] == bin)
  148.         {
  149.             return 1;
  150.         }
  151.         return 0;
  152.     }
  153.  
  154.     for (int c = start; c <= end; c++)
  155.     {
  156.         if (matrix[c][j] != bin)
  157.         {
  158.             return 0;
  159.         }
  160.     }
  161.  
  162.     return check_triangle_left(n, m, matrix, start, end, j, bin);
  163. }
  164.  
  165. int check_triangle_right(int n, int m, int matrix[n][m], int start, int end, int j, int bin)
  166. {
  167.     start++;
  168.     if (start >= n)
  169.     {
  170.         return 0;
  171.     }
  172.     end--;
  173.     if (end < 0)
  174.     {
  175.         return 0;
  176.     }
  177.     j++;
  178.     if (j >= m)
  179.     {
  180.         return 0;
  181.     }
  182.  
  183.     if (start == end)
  184.     {
  185.         if (matrix[start][j] == bin)
  186.         {
  187.             return 1;
  188.         }
  189.         return 0;
  190.     }
  191.  
  192.     for (int c = start; c <= end; c++)
  193.     {
  194.         if (matrix[c][j] != bin)
  195.         {
  196.             return 0;
  197.         }
  198.     }
  199.  
  200.     return check_triangle_right(n, m, matrix, start, end, j, bin);
  201. }
  202.  
  203. void look_for_triangles_vertical(int n, int m, int matrix[][m], int look_matrix[][m], int bin, int b, int *t)
  204. {
  205.  
  206.     int lineBin = 0;
  207.     int i = 0;
  208.  
  209.     while (i < n)
  210.     {
  211.         lineBin = 0;
  212.         int start = 0;
  213.         int end = 0;
  214.  
  215.         for (int j = 0; j < m; j++)
  216.         {
  217.             if (matrix[i][j] == bin && lineBin == 0)
  218.             {
  219.                 start = j;
  220.                 lineBin++;
  221.             }
  222.             else if (matrix[i][j] == bin)
  223.             {
  224.                 end = j;
  225.                 lineBin++;
  226.             }
  227.             else if (lineBin > 0)
  228.             {
  229.                 lineBin = 0;
  230.             }
  231.  
  232.             if (lineBin == b)
  233.             {
  234.                 break;
  235.             }
  236.            
  237.         }
  238.  
  239.         // Found a potential triangle
  240.         if (lineBin == b)
  241.         {
  242.             if (check_triangle_up(n, n, look_matrix, start, end, i, bin))
  243.             {
  244.                 *t = *t + 1;
  245.             }
  246.             if (check_triangle_down(n, n, look_matrix, start, end, i, bin))
  247.             {
  248.                 *t = *t + 1;
  249.             }
  250.             if (end != m - 1)
  251.             {
  252.                 matrix[i][start] = 2;
  253.                 i--;
  254.             }
  255.    
  256.         }
  257.         i++;
  258.     }
  259. }
  260.  
  261. void look_for_triangles_horizontal(int n, int m, int matrix[][m], int look_matrix[][m], int bin, int b, int *t)
  262. {
  263.  
  264.     int lineBin = 0;
  265.     int j = 0;
  266.  
  267.     while (j < m)
  268.     {
  269.         lineBin = 0;
  270.         int start = 0;
  271.         int end = 0;
  272.  
  273.         for (int i = 0; i < n; i++)
  274.         {
  275.             if (matrix[i][j] == bin && lineBin == 0)
  276.             {
  277.                 start = i;
  278.                 lineBin++;
  279.             }
  280.             else if (matrix[i][j] == bin && lineBin > 0)
  281.             {
  282.  
  283.                 end = i;
  284.                 lineBin++;
  285.             }
  286.             else if (lineBin > 0)
  287.             {
  288.                 lineBin = 0;
  289.             }
  290.  
  291.             if (lineBin == b)
  292.             {
  293.                 break;
  294.             }
  295.            
  296.         }
  297.  
  298.         // Found a potential triangle
  299.         if (lineBin == b)
  300.         {
  301.             if (check_triangle_left(n, n, look_matrix, start, end, j, bin))
  302.             {
  303.                 *t = *t + 1;
  304.             }
  305.             if (check_triangle_right(n, n, look_matrix, start, end, j, bin))
  306.             {
  307.                 *t = *t + 1;
  308.             }
  309.             if (end != n - 1)
  310.             {
  311.                 matrix[start][j] = 2;
  312.                 j--;
  313.             }
  314.    
  315.         }
  316.         j++;
  317.     }
  318. }
  319.  
  320. int main()
  321. {
  322.     int tests;
  323.     scanf("%d", &tests);
  324.  
  325.     for (int i = 0; i < tests; i++)
  326.     {
  327.         int n;
  328.         scanf("%d", &n);
  329.         int matrix[n][n];
  330.         read_matrix(n, n, matrix, 0, 0);
  331.         int look_matrix[n][n];
  332.         clone_matrix(n, n, matrix, look_matrix);
  333.  
  334.  
  335.         printf("Caso %d:\n", i + 1);
  336.        
  337.         for (int b = 3; b <= n; b++)
  338.         {
  339.             int t0 = 0;
  340.             int t1 = 0;
  341.    
  342.             if (b % 2 == 1)
  343.             {
  344.                 look_for_triangles_vertical(n, n, matrix, look_matrix, 1, b, &t1);
  345.                 clone_matrix(n, n, look_matrix, matrix);
  346.                 look_for_triangles_vertical(n, n, matrix, look_matrix, 0, b, &t0);
  347.                 clone_matrix(n, n, look_matrix, matrix);
  348.                 look_for_triangles_horizontal(n, n, matrix, look_matrix, 1, b, &t1);
  349.                 clone_matrix(n, n, look_matrix, matrix);
  350.                 look_for_triangles_horizontal(n, n, matrix, look_matrix, 0, b, &t0);
  351.             }
  352.  
  353.             if (t1 > 0)
  354.             {
  355.                 printf("%d triangulos de base %d formados por 1\n", t1, b);
  356.             }          
  357.         }
  358.  
  359.         for (int b = 3; b <= n; b++)
  360.         {
  361.             int t0 = 0;
  362.             int t1 = 0;
  363.    
  364.             if (b % 2 == 1)
  365.             {
  366.                 look_for_triangles_vertical(n, n, matrix, look_matrix, 1, b, &t1);
  367.                 clone_matrix(n, n, look_matrix, matrix);
  368.                 look_for_triangles_vertical(n, n, matrix, look_matrix, 0, b, &t0);
  369.                 clone_matrix(n, n, look_matrix, matrix);
  370.                 look_for_triangles_horizontal(n, n, matrix, look_matrix, 1, b, &t1);
  371.                 clone_matrix(n, n, look_matrix, matrix);
  372.                 look_for_triangles_horizontal(n, n, matrix, look_matrix, 0, b, &t0);
  373.             }
  374.  
  375.             if (t0 > 0)
  376.             {
  377.                 printf("%d triangulos de base %d formados por 0\n", t0, b);
  378.             }      
  379.         }
  380.  
  381.  
  382.  
  383.  
  384.  
  385.         printf("\n");
  386.     }
  387.    
  388. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement