Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #define pragma optimize GCC ("03")
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- int map_w = 10;
- int map_h = 10;
- int dragon_position[2];
- int princess_position[3][2];
- /*char map[20][40] = {
- { 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c' },
- { 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c' },
- { 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c' },
- { 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c' },
- { 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c' },
- { 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c' },
- { 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'p', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c' },
- { 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c' },
- { 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'd', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c' },
- { 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c' },
- { 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c' },
- { 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c' },
- { 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'p', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c' },
- { 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c' },
- { 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'p', 'c', 'c', 'c', 'c', 'c', 'c', 'c' },
- { 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c' },
- { 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c' },
- { 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c' },
- { 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c' },
- { 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c' }
- };*/
- char map[10][10] = {
- { 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c' },
- { 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c' },
- { 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c' },
- { 'c', 'c', 'd', 'c', 'c', 'c', 'c', 'c', 'c', 'c' },
- { 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'p', 'c', 'c' },
- { 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c' },
- { 'c', 'c', 'c', 'c', 'c', 'p', 'c', 'c', 'c', 'c' },
- { 'c', 'c', 'p', 'c', 'c', 'c', 'c', 'c', 'c', 'c' },
- { 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c' },
- { 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c' },
- };
- typedef struct uzol{
- int value;
- int g_value;
- int f_value;
- int h_value;
- int x, y;
- char type;
- bool checked;
- struct uzol *parent;
- }UZOL;
- typedef struct graf{
- UZOL ***uzol;
- int vyska;
- int sirka;
- }GRAF;
- typedef struct front{
- UZOL **uzly;
- int pocet;
- }FRONT;
- FRONT* create_front(FRONT* front){
- front = (FRONT*)malloc(sizeof(FRONT));
- front->uzly = (UZOL**)malloc(map_h*map_w*sizeof(UZOL*));
- front->pocet = 0;
- return front;
- }
- void front_write(FRONT* front){
- int i;
- if (front != NULL && front->pocet >= 1)
- for (i = 0; i < front->pocet; i++){
- //printf("H_value = %d, index uzla = %d, suradnice: [%d,%d]\n", front->uzly[i]->h_value, front->uzly[i]->value,front->uzly[i]->x,front->uzly[i]->y);
- printf("suradnice: [%d,%d], F_value = %d, index uzla = %d\n", front->uzly[i]->x, front->uzly[i]->y, front->uzly[i]->f_value, front->uzly[i]->value);
- }
- else
- printf("Empty front\n");
- }
- FRONT* front_sort(FRONT* front){
- UZOL* par;
- UZOL* pom;
- int pocet = front->pocet;
- while (pocet != 0){
- par = front->uzly[(pocet - 1) / 2];
- if (par->f_value > front->uzly[pocet]->f_value){
- pom = front->uzly[(pocet - 1) / 2];
- front->uzly[(pocet - 1) / 2] = front->uzly[pocet];
- front->uzly[pocet] = par;
- pocet = (pocet - 1) / 2;
- }
- else
- break;
- }
- return front;
- }
- FRONT *front_insert(FRONT *front, UZOL *u){
- int velkost;
- if (front == NULL)
- front = create_front(front);
- u->checked = true;
- velkost = front->pocet;
- front->uzly[velkost] = u;
- front = front_sort(front);
- front->pocet++;
- return front;
- }
- FRONT* front_Heap(FRONT *front, int i){
- int left, right;
- int min;
- UZOL *pom;
- left = (i * 2);
- right = (i * 2) + 1;
- do{
- if ((front->uzly[i]->f_value > front->uzly[left]->f_value) && (left <= (front->pocet - 1)) ){
- min = left;
- }
- else
- min = i;
- if ((front->uzly[min]->f_value > front->uzly[right]->f_value) && (right <= (front->pocet - 1)) ){
- min = right;
- }
- pom = front->uzly[i];
- front->uzly[i] = front->uzly[min];
- front->uzly[min] = pom;
- } while (min != i);
- return front;
- }
- FRONT *front_remove_min(FRONT *front){
- if (front != NULL){
- UZOL *min, *posledny;
- int velkost;
- velkost = front->pocet;
- posledny = front->uzly[velkost - 1];
- front->pocet--;
- min = front->uzly[0];
- front->uzly[0] = posledny;
- //front = front_Heap(front, 0);
- front = front_Heap(front, 0);
- return front;
- }
- else{
- printf("FRONT je prazdny!\n");
- return NULL;
- }
- }
- GRAF* create_graph(GRAF* graf){
- graf = (GRAF*)malloc(sizeof(GRAF));
- return graf;
- }
- GRAF* init_graph(GRAF* graf, int vyska, int sirka){
- int i, j, found_princess = 0, index = 0;
- graf->vyska = vyska;
- graf->sirka = sirka;
- graf->uzol = (UZOL***)malloc(vyska*sizeof(UZOL**));
- for (i = 0; i < vyska; i++){
- graf->uzol[i] = (UZOL**)malloc(sirka*sizeof(UZOL*));
- for (j = 0; j < sirka; j++){
- graf->uzol[i][j] = (UZOL*)malloc(sizeof(UZOL));
- graf->uzol[i][j]->value = index;
- index++;
- graf->uzol[i][j]->x = j;
- graf->uzol[i][j]->y = i;
- graf->uzol[i][j]->type = map[i][j];
- //printf("%c\n", graf->uzol[i][j]->type);
- graf->uzol[i][j]->parent = NULL;
- graf->uzol[i][j]->checked = false;
- graf->uzol[i][j]->g_value = 0;
- graf->uzol[i][j]->f_value = 0;
- if (map[i][j] == 'p'){
- princess_position[found_princess][0] = j;
- princess_position[found_princess][1] = i;
- found_princess++;
- }
- if (map[i][j] == 'd'){
- dragon_position[0] = j;
- dragon_position[1] = i;
- }
- }
- }
- /*for (i = 0; i < found_princess; i++){
- int x = princess_position[i][0];
- int y = princess_position[i][1];
- printf("PRINCEZNA NAJDENA NA SURADNICIACH [%d,%d] %c\n", x, y, graf->uzol[y][x]->type);
- }
- printf("DRAK NAJDENY NA SURADNICIACH [%d,%d] %c\n", dragon_position[0], dragon_position[1], graf->uzol[dragon_position[1]][dragon_position[0]]->type);*/
- return graf;
- }
- GRAF* set_h_value(GRAF* graf, char znak){
- int i, j, xdif, ydif;
- for (i = 0; i < graf->vyska; i++){
- for (j = 0; j < graf->sirka; j++){
- if (graf->uzol[i][j]->type == znak){
- //printf("ZHODA!! GRAF: %c ZNAK %c\n", graf->uzol[i][j]->type, znak);
- // printf("INDEXY: %d %d\n", i, j);
- graf->uzol[i][j]->h_value = 0;
- //printf("H_VALUE: %d\n", graf->uzol[i][j]->h_value);
- }
- else if (znak == 'd'){
- xdif = abs(j - dragon_position[0]);
- ydif = abs(i - dragon_position[1]);
- graf->uzol[i][j]->h_value = xdif + ydif;
- }
- else if (znak == 'p'){
- xdif = abs(j - princess_position[0][0]);
- ydif = abs(i - princess_position[0][1]);
- graf->uzol[i][j]->h_value = xdif + ydif;
- }
- }
- }
- return graf;
- }
- void graph_write(GRAF* graf){
- int i, j;
- printf("VYSKA: %d\n", graf->vyska);
- printf("SIRKA: %d\n", graf->sirka);
- getchar();
- for (i = 0; i < graf->vyska; i++){
- for (j = 0; j < graf->sirka; j++){
- printf("UZOL %d ZNAK: %c INDEXY: [%d,%d] VZDIALENOST: %d \n ", graf->uzol[i][j]->value, graf->uzol[i][j]->type, graf->uzol[i][j]->x, graf->uzol[i][j]->y, graf->uzol[i][j]->h_value);
- getchar();
- }
- }
- }
- UZOL* front_return(FRONT* front){
- return front->uzly[0];
- }
- int front_exist(FRONT* front, UZOL* u){
- if (front == NULL){
- return 0;
- }
- else{
- int j;
- for (j = 0; j < front->pocet; j++){
- if (front->uzly[j]->value == u->value)
- return 1;
- }
- }
- return 0;
- }
- void graph_checked(FRONT **openlist, FRONT **closedlist, UZOL* sus, UZOL* akt){
- if (front_exist(*closedlist, sus) == 0 && front_exist(*openlist, sus) == 0){
- printf("%d nie je v OL ani CL\n", sus->value);
- sus->g_value = 1; //akt->g_value + 1;
- printf("nastavil som g_value: %d\n", sus->g_value);
- }
- sus->f_value = sus->g_value + sus->h_value;
- printf("nastavil som f_value: %d\n", sus->f_value);
- sus->parent = akt;
- if (sus->checked == false)
- *openlist = front_insert(*openlist, sus);
- }
- void graph_search(GRAF* graf, int x, int y){
- FRONT* closed_list = NULL;
- FRONT* open_list = NULL;
- UZOL *akt, *ls = NULL, *ps = NULL, *hs = NULL, *ds = NULL, *pom = NULL;
- int index_draka = graf->uzol[dragon_position[1]][dragon_position[0]]->value;
- int index_z = graf->uzol[x][y]->value;
- int road[200];
- int i = 0;
- akt = graf->uzol[x][y];
- closed_list = front_insert(closed_list, akt);
- while (akt->value != index_draka){
- if (akt->x - 1 >= 0){ //lavy sused
- ls = graf->uzol[akt->y][akt->x - 1];
- if (ls->value == index_draka){
- ls->parent = akt;
- akt = ls;
- break;
- }
- graph_checked(&open_list, &closed_list, ls, akt);
- }
- if (akt->x + 1 <= graf->sirka){ //pravy sused
- ps = graf->uzol[akt->y][akt->x + 1];
- if (ps->value == index_draka){
- ps->parent = akt;
- akt = ps;
- break;
- }
- graph_checked(&open_list, &closed_list, ps, akt);
- }
- if (akt->y- 1 >= 0){ //horny sused
- hs = graf->uzol[akt->y - 1][akt->x];
- if (hs->value == index_draka){
- hs->parent = akt;
- akt = hs;
- break;
- }
- graph_checked(&open_list, &closed_list, hs, akt);
- }
- if (akt->y + 1 >= 0){ //dolny sused
- ds = graf->uzol[akt->y + 1][akt->x];
- if (ds->value == index_draka){
- ds->parent = akt;
- akt = ds;
- break;
- }
- graph_checked(&open_list, &closed_list, ds, akt);
- }
- printf("OPEN LIST\n");
- front_write(open_list);
- printf("CLOSED LIST\n");
- front_write(closed_list);
- akt = front_return(open_list);
- open_list = front_remove_min(open_list);
- closed_list = front_insert(closed_list, akt);
- printf("OPEN LIST\n");
- front_write(open_list);
- printf("CLOSED LIST\n");
- front_write(closed_list);
- printf("---------------------------------------------------\n");
- // getchar();
- }
- printf("Nasiel som %d!\nCesta: \n", index_draka);
- printf("%d %d\n", akt->x, akt->y);
- while (akt->value != index_z){
- road[i++] = akt->parent->x;
- road[i++] = akt->parent->y;
- printf("%d %d\n", akt->parent->x, akt->parent->y);
- akt = akt->parent;
- }
- }
- int main(){
- GRAF* graf = NULL;
- graf = create_graph(graf);
- graf = init_graph(graf, map_h, map_w);
- graf = set_h_value(graf, 'd');
- //graph_write(graf);
- graph_search(graf, 0, 0);
- getchar();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement