From e5853fa96cdb714da87b3f3d6ae9f21270286706 Mon Sep 17 00:00:00 2001 From: Peter Petrek Date: Fri, 14 Jan 2022 02:01:07 +0100 Subject: [PATCH] first --- cv1/program.c | 1 + sk1a/Makefile | 16 +++++++ sk1a/main.c | 39 ++++++++++++++++ sk1a/maze.c | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++ sk1a/maze.h | 22 +++++++++ 5 files changed, 204 insertions(+) create mode 100644 sk1a/Makefile create mode 100644 sk1a/main.c create mode 100644 sk1a/maze.c create mode 100644 sk1a/maze.h diff --git a/cv1/program.c b/cv1/program.c index 7986211..b3440a9 100644 --- a/cv1/program.c +++ b/cv1/program.c @@ -13,6 +13,7 @@ void hacker_script(char *string, int len); struct pizza { char name[size]; float price; + }; int main() { diff --git a/sk1a/Makefile b/sk1a/Makefile new file mode 100644 index 0000000..45d0a8e --- /dev/null +++ b/sk1a/Makefile @@ -0,0 +1,16 @@ +CC = gcc +CFLAGS = -g -Wall -Werror + +all: program + +program: maze.o main.o + $(CC) $(CFLAGS) maze.o main.o -o program + +maze.o: maze.c + $(CC) $(CFLAGS) -c maze.c -o maze.o + +main.o: main.c + $(CC) $(CFLAGS) -c main.c -o main.o + +clean: + rm -rf program *.o *.exe *.exe.stackdump \ No newline at end of file diff --git a/sk1a/main.c b/sk1a/main.c new file mode 100644 index 0000000..baaa08c --- /dev/null +++ b/sk1a/main.c @@ -0,0 +1,39 @@ +#define SZ 5 +#include +#include +#include "maze.h" + +void print_solution(char* matrix,int sz){ + for (int i = 0; i < sz * sz; i++){ + printf("%c ",matrix[i]); + if (i % sz == (sz-1)){ + printf("\n"); + } + } +} + +int main(){ + char tmaze[SZ+1][SZ+1]={ + "*xxx ", + " x", + " xx ", + " x ", + " x ", + }; + char maze[SZ*SZ]; + memset(maze,' ',SZ*SZ); + for (int i= 0; i < SZ; i++){ + for (int j= 0; j < SZ; j++){ + if (tmaze[i][j] == 'x'){ + maze[i*SZ+j] = 'x'; + } + } + } + int r = solve_maze(maze,SZ); + if (!r){ + printf("Nenasiel som riesenie\n"); + } + print_solution(maze,SZ); + + return 0; +} diff --git a/sk1a/maze.c b/sk1a/maze.c new file mode 100644 index 0000000..f88bee7 --- /dev/null +++ b/sk1a/maze.c @@ -0,0 +1,126 @@ +#include +#include +#include "maze.h" +#include +#include + +#define CHECKED_BIT 16 +#define DIRECTION_BITS 15 + +enum direction { + NORTH = 8, + EAST = 4, + SOUTH = 2, + WEST = 1, + NONE = 0 +}; + +int solve_maze(char* maze, int size) { + if (maze[0] == 'x') { + return 0; + } + + char maze2d[size][size]; + for (int y = 0; y < size; y++) { + for (int x = 0; x < size; x++) { + maze2d[y][x] = maze[size * y + x] == 'x' ? 'x' : 0; + } + } + + int posY = 0, posX = 0; + + while (1) { + enum direction next_step; + + if (posX + 1 != size && maze2d[posY][posX + 1] != 'x' && !(maze2d[posY][posX + 1] & CHECKED_BIT)) { + next_step = EAST; + } else if (posY + 1 != size && maze2d[posY + 1][posX] != 'x' && !(maze2d[posY + 1][posX] & CHECKED_BIT)) { + next_step = SOUTH; + } else if (posX - 1 >= 0 && maze2d[posY][posX - 1] != 'x' && !(maze2d[posY][posX - 1] & CHECKED_BIT)) { + next_step = WEST; + } else if (posY - 1 >= 0 && maze2d[posY - 1][posX] != 'x' && !(maze2d[posY - 1][posX] & CHECKED_BIT)) { + next_step = NORTH; + } else { + next_step = NONE; + } + + if (next_step != NONE) { + maze2d[posY][posX] |= CHECKED_BIT; + switch (next_step) { + case EAST: + posX += 1; + maze2d[posY][posX] |= WEST; + break; + case SOUTH: + posY += 1; + maze2d[posY][posX] |= NORTH; + break; + case WEST: + posX -= 1; + maze2d[posY][posX] |= EAST; + break; + case NORTH: + posY -= 1; + maze2d[posY][posX] |= SOUTH; + break; + default: + break; + } + } else { + char came_from = maze2d[posY][posX] & DIRECTION_BITS; + maze2d[posY][posX] = CHECKED_BIT; + switch (came_from) { + case EAST: + posX += 1; + break; + case SOUTH: + posY += 1; + break; + case WEST: + posX -= 1; + break; + case NORTH: + posY -= 1; + break; + default: + break; + } + } + + if (posX == 0 && posY == 0) { + return 0; + } else if (posX == size - 1 && posY == size - 1) { + maze2d[0][0] = '*'; + + //cleanup data bits + for (int i = 0; i < size; i++) { + for (int j = 0; j < size; j++) { + if (maze2d[i][j] == CHECKED_BIT || maze2d[i][j] == 0) { + maze2d[i][j] = ' '; + } else if (maze2d[i][j] != 'x') { + maze2d[i][j] = '*'; + } + } + } + + //cleanup redundant routes + for (int i = size - 2; i >= 0; i--) { + for (int j = size - 2; j >= 0; j--) { + if (maze2d[i][j] == '*' && maze2d[i + 1][j] == '*' && maze2d[i + 1][j + 1] == '*' && maze2d[i][j + 1] == '*') { + maze2d[i + 1][j + 1] = ' '; + maze2d[i][j + 1] = ' '; + } + } + } + + //serialize + for (int i = 0; i < size; i++) { + for (int j = 0; j < size; j++) { + maze[i * size + j] = maze2d[i][j]; + } + } + + return 1; + } + } +} diff --git a/sk1a/maze.h b/sk1a/maze.h new file mode 100644 index 0000000..2e34662 --- /dev/null +++ b/sk1a/maze.h @@ -0,0 +1,22 @@ +#ifndef _MAZEH +#define _MAZEH + +/** + * Funkcia by mala zobrať vstupnú mriežku a + * vyznačiť na nej cestu z ľavého horného rohu do pravého dolného rohu. + * Mriežka je uložená do jednorozmerného poľa, pričom najprv ide prvý riadok, + * za ním druhý a tak ďalej. + * + * Na mriežke sa nachádzajú znaky: + * ' ' - voľné miesto + * 'x' - stena. Stena nesmie byť prepísaná. + * '*' - poloha potkana. Na začiatku je na 0,0. + * + * @param maze Štvorcová mriežka rozmeru size x size. + * @param size Rozmer mriežky + * @return 1 ak existuje riešenie, 0 inak. + */ +int solve_maze(char* maze,int size); + + +#endif