Files
2026-06-12 20:49:22 +02:00

261 lines
7.9 KiB
C

#include <stdio.h>
#define UP 0
#define DOWN 1
#define LEFT 2
#define RIGHT 3
#define FRONT 4
#define BACK 5
typedef struct Cube {
int x, y, z;
char sticker[6];
} Cube;
void initialize(Cube* array, int pos[3][3][3]) {
for (int i=0; i<27; i++) {
// Calcolo le coordinate in base agli indici e le assegno ai cubetti
int x=i%3;
int y=(i/9);
int z=(i/3)%3;
array[i].x=x;
array[i].y=y;
array[i].z=z;
// Inizializzo tutti gli sticker e associo i colori ai cubetti
array[i].sticker[DOWN] = 'W';
array[i].sticker[UP] = 'Y';
array[i].sticker[LEFT] = 'B';
array[i].sticker[RIGHT] = 'G';
array[i].sticker[BACK] = 'O';
array[i].sticker[FRONT] = 'R';
// Mi salvo che cubetto ho per ogni coordinata
pos[x][y][z]=i;
}
}
void print(Cube* array, int pos[3][3][3]) {
printf(" %c %c %c\n %c %c %c\n %c %c %c", array[pos[0][2][2]].sticker[BACK], array[pos[1][2][2]].sticker[BACK], array[pos[2][2][2]].sticker[BACK], array[pos[0][1][2]].sticker[BACK], array[pos[1][1][2]].sticker[BACK], array[pos[2][1][2]].sticker[BACK], array[pos[0][0][2]].sticker[BACK], array[pos[1][0][2]].sticker[BACK], array[pos[2][0][2]].sticker[BACK]);
printf("\n\n %c %c %c\n %c %c %c\n %c %c %c", array[pos[0][0][2]].sticker[UP], array[pos[1][0][2]].sticker[UP], array[pos[2][0][2]].sticker[UP], array[pos[0][0][1]].sticker[UP], array[pos[1][0][1]].sticker[UP], array[pos[2][0][1]].sticker[UP], array[pos[0][0][0]].sticker[UP], array[pos[1][0][0]].sticker[UP], array[pos[2][0][0]].sticker[UP]);
printf("\n\n%c %c %c %c %c %c %c %c %c", array[pos[0][0][2]].sticker[LEFT], array[pos[0][0][1]].sticker[LEFT], array[pos[0][0][0]].sticker[LEFT], array[pos[0][0][0]].sticker[FRONT], array[pos[1][0][0]].sticker[FRONT], array[pos[2][0][0]].sticker[FRONT], array[pos[2][0][0]].sticker[RIGHT], array[pos[2][0][1]].sticker[RIGHT], array[pos[2][0][2]].sticker[RIGHT]);
printf("\n%c %c %c %c %c %c %c %c %c", array[pos[0][1][2]].sticker[LEFT], array[pos[0][1][1]].sticker[LEFT], array[pos[0][1][0]].sticker[LEFT], array[pos[0][1][0]].sticker[FRONT], array[pos[1][1][0]].sticker[FRONT], array[pos[2][1][0]].sticker[FRONT], array[pos[2][1][0]].sticker[RIGHT], array[pos[2][1][1]].sticker[RIGHT], array[pos[2][1][2]].sticker[RIGHT]);
printf("\n%c %c %c %c %c %c %c %c %c", array[pos[0][2][2]].sticker[LEFT], array[pos[0][2][1]].sticker[LEFT], array[pos[0][2][0]].sticker[LEFT], array[pos[0][2][0]].sticker[FRONT], array[pos[1][2][0]].sticker[FRONT], array[pos[2][2][0]].sticker[FRONT], array[pos[2][2][0]].sticker[RIGHT], array[pos[2][2][1]].sticker[RIGHT], array[pos[2][2][2]].sticker[RIGHT]);
printf("\n\n %c %c %c\n %c %c %c\n %c %c %c\n\n\n\n", array[pos[0][2][0]].sticker[DOWN], array[pos[1][2][0]].sticker[DOWN], array[pos[2][2][0]].sticker[DOWN], array[pos[0][2][1]].sticker[DOWN], array[pos[1][2][1]].sticker[DOWN], array[pos[2][2][1]].sticker[DOWN], array[pos[0][2][2]].sticker[DOWN], array[pos[1][2][2]].sticker[DOWN], array[pos[2][2][2]].sticker[DOWN]);
}
void rotate(Cube* array, int pos[3][3][3], char rotazione) {
int involved_cubes[9];
int index=0;
int tmp_x, tmp_y, tmp_z;
// z=0
if (rotazione == 'F') {
for (int i=0; i<3; i++) {
for (int j=0; j<3; j++) {
involved_cubes[index]=pos[i][j][0];
index++;
}
}
for (index=0; index<9; index++) {
int i=involved_cubes[index];
tmp_x = array[i].x;
tmp_y = array[i].y;
array[i].x=2-tmp_y;
array[i].y=tmp_x;
pos[array[i].x][array[i].y][0]=i;
char tmp = array[i].sticker[UP];
array[i].sticker[UP] = array[i].sticker[LEFT];
array[i].sticker[LEFT] = array[i].sticker[DOWN];
array[i].sticker[DOWN] = array[i].sticker[RIGHT];
array[i].sticker[RIGHT] = tmp;
}
}
// z=2
if (rotazione == 'B') {
for (int i=0; i<3; i++) {
for (int j=0; j<3; j++) {
involved_cubes[index]=pos[i][j][2];
index++;
}
}
for (index=0; index<9; index++) {
int i=involved_cubes[index];
tmp_x = array[i].x;
tmp_y = array[i].y;
array[i].x=tmp_y;
array[i].y=2-tmp_x;
pos[array[i].x][array[i].y][2]=i;
char tmp = array[i].sticker[DOWN];
array[i].sticker[DOWN] = array[i].sticker[LEFT];
array[i].sticker[LEFT] = array[i].sticker[UP];
array[i].sticker[UP] = array[i].sticker[RIGHT];
array[i].sticker[RIGHT] = tmp;
}
}
// y=0
if (rotazione == 'U') {
for (int i=0; i<3; i++) {
for (int j=0; j<3; j++) {
involved_cubes[index]=pos[i][0][j];
index++;
}
}
for (index=0; index<9; index++) {
int i=involved_cubes[index];
tmp_x = array[i].x;
tmp_z = array[i].z;
array[i].x=tmp_z;
array[i].z=2-tmp_x;
pos[array[i].x][0][array[i].z]=i;
char tmp = array[i].sticker[FRONT];
array[i].sticker[FRONT] = array[i].sticker[RIGHT];
array[i].sticker[RIGHT] = array[i].sticker[BACK];
array[i].sticker[BACK] = array[i].sticker[LEFT];
array[i].sticker[LEFT] = tmp;
}
}
// y=2
if (rotazione == 'D') {
for (int i=0; i<3; i++) {
for (int j=0; j<3; j++) {
involved_cubes[index]=pos[i][2][j];
index++;
}
}
for (index=0; index<9; index++) {
int i=involved_cubes[index];
tmp_x = array[i].x;
tmp_z = array[i].z;
array[i].x=2-tmp_z;
array[i].z=tmp_x;
pos[array[i].x][2][array[i].z]=i;
char tmp = array[i].sticker[FRONT];
array[i].sticker[FRONT] = array[i].sticker[LEFT];
array[i].sticker[LEFT] = array[i].sticker[BACK];
array[i].sticker[BACK] = array[i].sticker[RIGHT];
array[i].sticker[RIGHT] = tmp;
}
}
// x=0
if (rotazione == 'L') {
for (int i=0; i<3; i++) {
for (int j=0; j<3; j++) {
involved_cubes[index]=pos[0][i][j];
index++;
}
}
for (index=0; index<9; index++) {
int i=involved_cubes[index];
tmp_y = array[i].y;
tmp_z = array[i].z;
array[i].y=2-tmp_z;
array[i].z=tmp_y;
pos[0][array[i].y][array[i].z]=i;
char tmp = array[i].sticker[UP];
array[i].sticker[UP] = array[i].sticker[BACK];
array[i].sticker[BACK] = array[i].sticker[DOWN];
array[i].sticker[DOWN] = array[i].sticker[FRONT];
array[i].sticker[FRONT] = tmp;
}
}
// x=2
if (rotazione == 'R') {
for (int i=0; i<3; i++) {
for (int j=0; j<3; j++) {
involved_cubes[index]=pos[2][i][j];
index++;
}
}
for (index=0; index<9; index++) {
int i=involved_cubes[index];
tmp_y = array[i].y;
tmp_z = array[i].z;
array[i].y=tmp_z;
array[i].z=2-tmp_y;
pos[2][array[i].y][array[i].z]=i;
char tmp = array[i].sticker[UP];
array[i].sticker[UP] = array[i].sticker[FRONT];
array[i].sticker[FRONT] = array[i].sticker[DOWN];
array[i].sticker[DOWN] = array[i].sticker[BACK];
array[i].sticker[BACK] = tmp;
}
}
}
int main() {
Cube array[27];
int pos[3][3][3];
initialize(array, pos);
rotate(array, pos, 'F');
print(array, pos);
rotate(array, pos, 'U');
print(array, pos);
}