Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- void clone_matrix(int n, int m, int matrix1[][m], int matrix2[][m])
- {
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < m; j++)
- {
- matrix2[i][j] = matrix1[i][j];
- }
- }
- }
- int count(int n, int m, int matrix[][m], int k, int counter)
- {
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < m; j++)
- {
- if (matrix[i][j] == k)
- {
- counter++;
- }
- }
- }
- return counter;
- }
- void read_matrix(int n, int m, int matrix[][m], int i, int j)
- {
- if (i == n)
- {
- return;
- }
- scanf("%d", &matrix[i][j]);
- j++;
- if (j == m)
- {
- j = 0;
- i++;
- }
- read_matrix(n, m, matrix, i, j);
- }
- int check_triangle_up(int n, int m, int matrix[n][m], int start, int end, int i, int bin)
- {
- start++;
- if (start >= m)
- {
- return 0;
- }
- end--;
- if (end < 0)
- {
- return 0;
- }
- i--;
- if (i < 0)
- {
- return 0;
- }
- if (start == end)
- {
- if (matrix[i][start] == bin)
- {
- return 1;
- }
- return 0;
- }
- for (int c = start; c <= end; c++)
- {
- if (matrix[i][c] != bin)
- {
- return 0;
- }
- }
- return check_triangle_up(n, m, matrix, start, end, i, bin);
- }
- int check_triangle_down(int n, int m, int matrix[n][m], int start, int end, int i, int bin)
- {
- start++;
- if (start >= m)
- {
- return 0;
- }
- end--;
- if (end < 0)
- {
- return 0;
- }
- i++;
- if (i >= n)
- {
- return 0;
- }
- if (start == end)
- {
- if (matrix[i][start] == bin)
- {
- return 1;
- }
- return 0;
- }
- for (int c = start; c <= end; c++)
- {
- if (matrix[i][c] != bin)
- {
- return 0;
- }
- }
- return check_triangle_down(n, m, matrix, start, end, i, bin);
- }
- int check_triangle_left(int n, int m, int matrix[n][m], int start, int end, int j, int bin)
- {
- start++;
- if (start >= n)
- {
- return 0;
- }
- end--;
- if (end < 0)
- {
- return 0;
- }
- j--;
- if (j < 0)
- {
- return 0;
- }
- if (start == end)
- {
- if (matrix[start][j] == bin)
- {
- return 1;
- }
- return 0;
- }
- for (int c = start; c <= end; c++)
- {
- if (matrix[c][j] != bin)
- {
- return 0;
- }
- }
- return check_triangle_left(n, m, matrix, start, end, j, bin);
- }
- int check_triangle_right(int n, int m, int matrix[n][m], int start, int end, int j, int bin)
- {
- start++;
- if (start >= n)
- {
- return 0;
- }
- end--;
- if (end < 0)
- {
- return 0;
- }
- j++;
- if (j >= m)
- {
- return 0;
- }
- if (start == end)
- {
- if (matrix[start][j] == bin)
- {
- return 1;
- }
- return 0;
- }
- for (int c = start; c <= end; c++)
- {
- if (matrix[c][j] != bin)
- {
- return 0;
- }
- }
- return check_triangle_right(n, m, matrix, start, end, j, bin);
- }
- void look_for_triangles_vertical(int n, int m, int matrix[][m], int look_matrix[][m], int bin, int b, int *t)
- {
- int lineBin = 0;
- int i = 0;
- while (i < n)
- {
- lineBin = 0;
- int start = 0;
- int end = 0;
- for (int j = 0; j < m; j++)
- {
- if (matrix[i][j] == bin && lineBin == 0)
- {
- start = j;
- lineBin++;
- }
- else if (matrix[i][j] == bin)
- {
- end = j;
- lineBin++;
- }
- else if (lineBin > 0)
- {
- lineBin = 0;
- }
- if (lineBin == b)
- {
- break;
- }
- }
- // Found a potential triangle
- if (lineBin == b)
- {
- if (check_triangle_up(n, n, look_matrix, start, end, i, bin))
- {
- *t = *t + 1;
- }
- if (check_triangle_down(n, n, look_matrix, start, end, i, bin))
- {
- *t = *t + 1;
- }
- if (end != m - 1)
- {
- matrix[i][start] = 2;
- i--;
- }
- }
- i++;
- }
- }
- void look_for_triangles_horizontal(int n, int m, int matrix[][m], int look_matrix[][m], int bin, int b, int *t)
- {
- int lineBin = 0;
- int j = 0;
- while (j < m)
- {
- lineBin = 0;
- int start = 0;
- int end = 0;
- for (int i = 0; i < n; i++)
- {
- if (matrix[i][j] == bin && lineBin == 0)
- {
- start = i;
- lineBin++;
- }
- else if (matrix[i][j] == bin && lineBin > 0)
- {
- end = i;
- lineBin++;
- }
- else if (lineBin > 0)
- {
- lineBin = 0;
- }
- if (lineBin == b)
- {
- break;
- }
- }
- // Found a potential triangle
- if (lineBin == b)
- {
- if (check_triangle_left(n, n, look_matrix, start, end, j, bin))
- {
- *t = *t + 1;
- }
- if (check_triangle_right(n, n, look_matrix, start, end, j, bin))
- {
- *t = *t + 1;
- }
- if (end != n - 1)
- {
- matrix[start][j] = 2;
- j--;
- }
- }
- j++;
- }
- }
- int main()
- {
- int tests;
- scanf("%d", &tests);
- for (int i = 0; i < tests; i++)
- {
- int n;
- scanf("%d", &n);
- int matrix[n][n];
- read_matrix(n, n, matrix, 0, 0);
- int look_matrix[n][n];
- clone_matrix(n, n, matrix, look_matrix);
- printf("Caso %d:\n", i + 1);
- for (int b = 3; b <= n; b++)
- {
- int t0 = 0;
- int t1 = 0;
- if (b % 2 == 1)
- {
- look_for_triangles_vertical(n, n, matrix, look_matrix, 1, b, &t1);
- clone_matrix(n, n, look_matrix, matrix);
- look_for_triangles_vertical(n, n, matrix, look_matrix, 0, b, &t0);
- clone_matrix(n, n, look_matrix, matrix);
- look_for_triangles_horizontal(n, n, matrix, look_matrix, 1, b, &t1);
- clone_matrix(n, n, look_matrix, matrix);
- look_for_triangles_horizontal(n, n, matrix, look_matrix, 0, b, &t0);
- }
- if (t1 > 0)
- {
- printf("%d triangulos de base %d formados por 1\n", t1, b);
- }
- }
- for (int b = 3; b <= n; b++)
- {
- int t0 = 0;
- int t1 = 0;
- if (b % 2 == 1)
- {
- look_for_triangles_vertical(n, n, matrix, look_matrix, 1, b, &t1);
- clone_matrix(n, n, look_matrix, matrix);
- look_for_triangles_vertical(n, n, matrix, look_matrix, 0, b, &t0);
- clone_matrix(n, n, look_matrix, matrix);
- look_for_triangles_horizontal(n, n, matrix, look_matrix, 1, b, &t1);
- clone_matrix(n, n, look_matrix, matrix);
- look_for_triangles_horizontal(n, n, matrix, look_matrix, 0, b, &t0);
- }
- if (t0 > 0)
- {
- printf("%d triangulos de base %d formados por 0\n", t0, b);
- }
- }
- printf("\n");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement