-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLatinSquare.c
More file actions
134 lines (116 loc) · 2.45 KB
/
LatinSquare.c
File metadata and controls
134 lines (116 loc) · 2.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*
* @Name: Latin Square Generation C
* @Repository: https://github.com/BaseMax/LatinSquareGenerationC
* @Author: Max Base
* @Date: 2022/03/29
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int x;
int y;
int** data;
} mymatrix;
void reverse(int *arr, int size)
{
for(int i = 0; i < size/2; i++) {
int temp = arr[i];
arr[i] = arr[size - 1 - i];
arr[size - 1 - i] = temp;
}
}
int* balance(int* members, int size, int shift)
{
int* result = malloc(sizeof(int) * size);
for(int i = 0, j = 0, h = 0; i < size; ++i) {
int val, idx;
if(i < 2 || i % 2 != 0)
val = j++;
else {
val = size - h - 1;
++h;
}
idx = (val + shift) % size;
result[i] = members[idx];
}
if(size % 2 != 0 && shift % 2 != 0)
reverse(result, size);
return result;
}
int isValidSize(int n)
{
return (n % 1 == 0) && n > 0;
}
void matrixInit(mymatrix *m)
{
m->data = malloc((sizeof(int) * m->y));
for(int i=0; i < m->y; i++) {
m->data[i] = malloc((sizeof(int) * m->x));
for(int j=0; j < m->x; j++) {
m->data[i][j] = 0;
}
}
}
mymatrix* latinSquare(int size)
{
mymatrix *lSquare = malloc(sizeof(mymatrix) * 1);
lSquare->x = size;
lSquare->y = size;
matrixInit(lSquare);
if(isValidSize(size)) {
int *conditions = malloc(sizeof(int) * size);
for(int i = 1; i<= size; i++)
conditions[i-1] = i;
lSquare->data[0] = conditions;
for(int r = 0; r < size; r++) {
if(size > 100) printf("%d/%d\n", r+1, size);
lSquare->data[r] = balance(conditions, size, r);
}
}
return lSquare;
}
void display(mymatrix *m)
{
printf("[\n");
for(int y=0; y < m->y; y++) {
printf("\t[ ");
for(int x=0; x < m->x; x++) printf("%d, ", m->data[y][x]);
printf("\t],\n");
}
printf("]\n");
}
void display_tab(mymatrix *m)
{
for(int y=0; y < m->y; y++) {
for(int x=0; x < m->x; x++) printf("%d\t", m->data[y][x]);
printf("\n");
}
}
void save(mymatrix *m)
{
// create "latinSquare-{m->x}.csv" file
char filename[100];
sprintf(filename, "latinSquare-%d.csv", m->x);
FILE *fp = fopen(filename, "w");
if(fp == NULL) {
printf("Error creating file!\n");
exit(1);
}
// write data to file
for(int y=0; y < m->y; y++) {
for(int x=0; x < m->x; x++)
fprintf(fp, "%d,", m->data[y][x]);
fprintf(fp, "\n");
}
// close file
fclose(fp);
}
int main(int argc, char** argv)
{
int size = 10; // 1073741824;
if(argc > 1) sscanf(argv[1], "%d", &size);
mymatrix *m = latinSquare(size);
if(size <= 100) display(m); // display_tab(m);
save(m);
return 0;
}