Проверить, является ли заданная целочисленная матрица
латинским квадратом. Латинским квадратом порядка n называется
квадратная матрица размера n*n, каждая строка и каждый столбец
которой содержат все числа от 1 до n.
C/C++
Задача на языке программирования СИ на тему матрицы
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
int ascending(const void* a, const void* b) {
int va = *((int*)a);
int vb = *((int*)b);
if (va < vb) return -1;
if (va > vb) return 1;
return 0;
}
_Bool isrange(unsigned* line, size_t n) {
unsigned* tmp = (unsigned*)malloc(n * sizeof(unsigned));
size_t i = 0;
do tmp[i] = line[i]; while (++i < n);
qsort(tmp, n, sizeof(unsigned), ascending);
for (i = 0; i < n; ++i) if (tmp[i] != i + 1) {
free(tmp);
return false;
}
free(tmp);
return true;
}
_Bool latsq(unsigned** mx, size_t n) {
unsigned* tmp = NULL;
size_t i = 0, j;
do if (!isrange(mx[i], n)) return false; while (++i < n);
tmp = (unsigned*)malloc(n * sizeof(unsigned));
for (j = 0; j < n; ++j) {
for (i = 0; i < n; ++i) tmp[i] = mx[i][j];
if (!isrange(tmp, n)) {
free(tmp);
return false;
}
}
free(tmp);
return true;
}
int main(void) {
unsigned** mx = NULL;
size_t n = 0;
size_t i, j;
while (!n) {
printf("n: ");
scanf_s("%u", &n);
}
mx = (unsigned**)malloc(n * sizeof(unsigned*));
puts("Input matrix: ");
for (i = 0; i < n; ++i) {
mx[i] = (unsigned*)malloc(n * sizeof(unsigned));
for (j = 0; j < n; ++j) scanf_s("%u", &mx[i][j]);
}
puts(latsq(mx, n) ? "Yes" : "No");
for (i = 0; i < n; ++i) free(mx[i]);
free(mx);
system("pause > nul");
return 0;
}
#include <stdio.h>
#include <stdbool.h>
int ascending(const void* a, const void* b) {
int va = *((int*)a);
int vb = *((int*)b);
if (va < vb) return -1;
if (va > vb) return 1;
return 0;
}
_Bool isrange(unsigned* line, size_t n) {
unsigned* tmp = (unsigned*)malloc(n * sizeof(unsigned));
size_t i = 0;
do tmp[i] = line[i]; while (++i < n);
qsort(tmp, n, sizeof(unsigned), ascending);
for (i = 0; i < n; ++i) if (tmp[i] != i + 1) {
free(tmp);
return false;
}
free(tmp);
return true;
}
_Bool latsq(unsigned** mx, size_t n) {
unsigned* tmp = NULL;
size_t i = 0, j;
do if (!isrange(mx[i], n)) return false; while (++i < n);
tmp = (unsigned*)malloc(n * sizeof(unsigned));
for (j = 0; j < n; ++j) {
for (i = 0; i < n; ++i) tmp[i] = mx[i][j];
if (!isrange(tmp, n)) {
free(tmp);
return false;
}
}
free(tmp);
return true;
}
int main(void) {
unsigned** mx = NULL;
size_t n = 0;
size_t i, j;
while (!n) {
printf("n: ");
scanf_s("%u", &n);
}
mx = (unsigned**)malloc(n * sizeof(unsigned*));
puts("Input matrix: ");
for (i = 0; i < n; ++i) {
mx[i] = (unsigned*)malloc(n * sizeof(unsigned));
for (j = 0; j < n; ++j) scanf_s("%u", &mx[i][j]);
}
puts(latsq(mx, n) ? "Yes" : "No");
for (i = 0; i < n; ++i) free(mx[i]);
free(mx);
system("pause > nul");
return 0;
}
Похожие вопросы
- Помогите решить задачу на языке программирования Си, пожалуйста
- Задача на языке программирования C++
- Написать программу на языке программирования Си.
- Задача на языке программирования C#
- Помогите решить задачу на языке программирования С++
- Задача на языке программирования C++
- Задача по языку программированию C++
- Помогите с решением задачи на языке СИ
- Решить задачу на языке СИ
- На каком языке программирования написан C (Си)?