Am i the first one to finish these psets? IDK.

This commit is contained in:
juan 2021-12-03 00:07:02 +08:00
parent 640706968c
commit 5947dff0d9
No known key found for this signature in database
GPG key ID: 5C1E5093C74F1DC7

76
pset11/2-6-SneakyMatrix.c Normal file
View file

@ -0,0 +1,76 @@
// More of a math problem
#include <stdio.h>
#define MAX 100
// *** THERE IS AN SIMPLER SOLUTION, THIS ONE IS BLOATED AND BAD ***
//
// There are two main movements:
// 1: diagonal move, which includes two ways: i++&&j-- and i--&&j++
// ^way = 0 ^way = 1
// and for the diagonal move, the are six scenarios where the next step hits the
// boundary.
// a: nexti < n, nextj < 0 where i is valid. Results in i++
// b: nexti < 0, nextj < n where j is valid. Results in j++
// c: nexti >=n, nextj < 0 where none is valid. Results in j++
// d: nexti <0, nextj >= n where none is valid. Results in i++
// e: nexti >=n, nextj >=0 where j is valid. Results in j++
// f: nexti >=0, nextj >=n where i is valid. Results in i++
//
// 2: horizontal and vertical move, which includes two ways as well: i++ and j++
// The movement stops when i == j and j == n
void fill(int matrix[][MAX], int n);
int main(void) {
int n;
scanf("%d", &n);
int matrix[n][MAX];
fill(matrix, n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - 1; j++) {
printf("%d ", matrix[i][j]);
}
printf("%d\n", matrix[i][n - 1]);
}
return 0;
}
void fill(int matrix[][MAX], int n) {
int i = 0, j = 0;
int nexti, nextj;
int way = 1;
int count = 1;
while (count <= n * n) {
matrix[i][j] = count++;
if (way == 1) {
nexti = i + 1;
nextj = j - 1;
} else {
nexti = i - 1;
nextj = j + 1;
}
// Validate if the next step is in the matrix.
// First: the next step is within matrix.
if (nexti >= 0 && nexti < n && nextj >= 0 && nextj < n) {
i = nexti;
j = nextj;
} else {
// Second: the next step is out of boundary.
if (nextj < 0 && nexti < n) {
i++;
} else if (nexti < 0 && nextj < n) {
j++;
} else if (nexti >= n && nextj < 0) {
j++;
} else if (nexti < 0 && nextj >= n) {
i++;
} else if (nexti >= n && nextj >= 0) {
j++;
} else if (nexti >= 0 && nextj >= n) {
i++;
}
way *= -1;
}
}
}