Графы Release
Never
//Code was made by Grig_Kosilov, Moscow, 2019 #include <limits.h> #include <stdio.h> #include <time.h> typedef enum room_type { vacuum, junction, dead_end, exit } room_type; typedef struct beg { int size; struct room* head; } beg; typedef struct room { room_type type; struct info* info; struct edge* first; } room; typedef struct info { int cord_x; int cord_y; } info; typedef struct edge { int key; struct edge* next; } edge; int getInt(int*); char* getStr(); const char* msgs[] = { "0.Quit", "1.Add room", "2.Add pathway", "3.Delete room", "4.Find exit", "5.Show", "6.Timing", "7.Input from file", "8.Output in file", "9.Random Generation" }; const int NMsgs = sizeof(msgs) / sizeof(msgs[0]); //int main(); beg init(); int dialog(const char* msgs[], int N); void deleteall(beg*); //void dell_one(beg*, int); int D_Add_room(beg*); int add_room(beg*, int, int, int); int find_notexist_empty(beg*, int, int); void add_info(room*, int, int, int); int D_Add_pathway(beg*); int add_pathway(beg*, int, int); int work_add_pathway(room*, int); void transfer(edge*, int); void junction_add(room*); int D_Delete_room(beg*); void delete(beg*, int); void dell_one(beg*, int); void maze_cut(beg*); int D_Find_exit(beg*); int find_exit(beg*, int); int D_Show(beg*); void show(beg*); int D_Timing(); int D_File_in(beg* maze); int FileOpenFlag = 0; beg read_maze(FILE*); int D_File_out(beg* maze); int write_maze(beg* maze, FILE* file); int D_Random_Generation(beg* maze); void rand_gen(beg*, int, int); int TF_gen(); int (*fptr[])(beg*) = { NULL, D_Add_room, D_Add_pathway, D_Delete_room, D_Find_exit, D_Show, D_Timing, D_File_in, D_File_out, D_Random_Generation }; int getInt(int* pn) { const char* errmsg = ""; int n; do { puts(errmsg); errmsg = "Repeat input"; n = scanf_s("%d", pn); if (n < 0) return 0; scanf_s("%*[^\n]"); scanf_s("%*c"); } while (n == 0); return 1; } char* getStr() { char* ptr = (char*)malloc(sizeof(char)); char buf[81]; int n, len = 0; *ptr = '\0'; do { n = scanf_s("%80[^\n]", buf, 81); if (n < 0) { free(ptr); return NULL; } else if (n) { len += strlen(buf); ptr = (char*)realloc(ptr, len + 1); int k = strcspn(buf, "\0"); // длина слова int l = strlen(ptr) + k + 1; strncat_s(ptr, l, buf, k); } } while (n > 0); scanf_s("%*c"); return ptr; } int dialog(const char* msgs[], int N) { char* errmsg = ""; int rc; int i, n; do { puts(errmsg); errmsg = "You are wrong. Repeate, please!"; for (i = 0; i < N; ++i) puts(msgs[i]); puts("Make your choice: --> "); n = getInt(&rc); if (n == 0) rc = 0; } while (rc < 0 || rc >= N); return rc; } int main() { beg maze=init(); int rc; while (rc = dialog(msgs, NMsgs)) if (!fptr[rc](&maze)) break; if (FileOpenFlag) D_File_out(&maze); deleteall(&maze); return 0; } beg init() { beg* maze= (beg*)malloc(sizeof(beg)); maze->size = 0; maze->head = NULL; return *maze; } void deleteall(beg* maze) { int i; for (i = 0; i < maze->size; ++i) dell_one(maze, i); //free(maze); } int D_Add_room(beg* maze) { int n, x, y, f; puts("Enter x cord: -->"); n = getInt(&x); if (n == 0) return 0; puts("Enter y cord: -->"); n = getInt(&y); if (n == 0) return 0; puts("Pls, enter 1 if this room will exit-room"); n = getInt(&f); if (n == 0) return 0; add_room(maze, x, y, f); return 1; } int add_room(beg* maze, int x, int y, int exit_flag) { int p = find_notexist_empty(maze, x, y); if (p != -1) { add_info(&(maze->head[p]), x, y, exit_flag); printf("Room was added with key: %d \n", p); return 1; } else return 0; } int find_notexist_empty(beg* maze, int x, int y) { int i, buf = -1; for (i = 0; i < maze->size; ++i) { if (maze->head[i].info->cord_x == x) if (maze->head[i].info->cord_y == y) { puts("Room with this cords is already exist with"); printf("key: %d, type: %d \n", i, maze->head[i].type); return buf; } if (maze->head[i].type == vacuum) buf = i; } if (buf == -1) { maze->size += 1; maze->head =realloc(maze->head, (i + 1) * sizeof(room)); maze->head[maze->size-1].first = NULL; buf = maze->size-1; } return buf; } void add_info(room* curr, int x, int y, int exit_flag) { curr->info = malloc(sizeof(info)); curr->info->cord_x = x; curr->info->cord_y = y; if (exit_flag == 1) curr->type = exit; else curr->type = dead_end; } int D_Add_pathway(beg* maze) { int k1, k2, n; puts("Enter 1st key: -->"); n = getInt(&k1); if (n == 0) return 0; puts("Enter 2nd key: -->"); n = getInt(&k2); if (n == 0) return 0; add_pathway(maze, k1, k2); return 1; } int add_pathway(beg* maze, int key1, int key2) { if (key1 >= maze->size || key2 >= maze->size) { puts("Room hasn't found."); return 0; } if (maze->head[key1].type == vacuum || maze->head[key2].type == vacuum) { puts("Room hasn't found."); return 0; } if (key1 == key2) { puts("Loop pathways isn't allow."); return 0; } int n = work_add_pathway(&(maze->head[key1]), key2); if (n == 1) { junction_add(&(maze->head[key1])); work_add_pathway(&(maze->head[key2]), key1); junction_add(&(maze->head[key2])); } else return 0; return 1; } int work_add_pathway(room* p_r, int key) { if (p_r->first == NULL) { p_r->first = malloc(sizeof(edge)); p_r->first->key = key; p_r->first->next = NULL; puts("Pathway was created successfully."); return 1; } edge* p_e = p_r->first; for (; p_e->next != NULL; p_e = p_e->next) { if (p_e->key == key) { puts("Pathway is already exist."); return 1; } if (p_e->next->key > key) { transfer(p_e, key); puts("Pathway was created successfully."); return 1; } } if (p_e->next == NULL) { if (p_e->key == key) { puts("Pathway is already exist."); return 0; } transfer(p_e, key); puts("Pathway was created successfully."); return 1; } return 0; } void transfer(edge* p_e, int key) { edge* buf_p_e_next = p_e->next; p_e->next = malloc(sizeof(edge)); p_e = p_e->next; p_e->key = key; p_e->next = buf_p_e_next; } void junction_add(room* p) { if (p->first && p->first->next && p->type != exit) p->type = junction; } int D_Delete_room(beg* maze) { int k, n; puts("Enter key: -->"); n = getInt(&k); if (n == 0) return 0; delete(maze, k); return 1; } void delete(beg* maze, int k) { //Удаляем связи edge* p_e = maze->head[k].first; for (; p_e != NULL; p_e=p_e->next) { if (maze->head[p_e->key].first->next == NULL) { edge* p_e_del = maze->head[p_e->key].first; maze->head[k].first = NULL; free(p_e_del); } else { edge* p_e_notdel = maze->head[p_e->key].first; if (p_e_notdel->key == k) { edge* p_e_del = p_e_notdel; maze->head[p_e->key].first = p_e_notdel->next; free(p_e_del); } else { for (; p_e_notdel->next != NULL; p_e_notdel = p_e_notdel->next) { if (p_e_notdel->next->key == k) { edge* p_e_del = p_e_notdel->next; p_e_notdel->next = p_e_notdel->next->next; free(p_e_del); break; } } } } } dell_one(maze, k); maze->head[k].first = NULL; maze->head[k].type = vacuum; maze_cut(maze); } void dell_one(beg* maze, int k) { edge* p_e = maze->head[k].first; while (p_e != NULL) { edge* p_e_del = p_e; p_e = p_e->next; free(p_e_del); } free(maze->head[k].info); } void maze_cut(beg* maze) { int i, del_num = 0; for (i = maze->size-1; i > 0; --i) { if (maze->head[i].type != vacuum) return 0; else del_num += 1; } maze->size -= del_num; maze->head = realloc(maze->head, (maze->size) * sizeof(room)); } int D_Find_exit(beg* maze) { int k, n; puts("Enter key: -->"); n = getInt(&k); if (n == 0) return 0; find_exit(maze, k); return 1; } int find_exit(beg* maze, int key) { enum Color { white, gray, black }; enum Color* color = malloc(sizeof(int) * maze->size); int* len = malloc(sizeof(int) * maze->size); int* prev = malloc(sizeof(int) * maze->size); int t = 0; int* exit_rooms = malloc(sizeof(int) * 0); edge* queue = malloc(sizeof(edge)*0); edge* last = queue; int i; for (i=0; i < maze->size; ++i) { color[i] = white; len[i] = -1; prev[i] = 0; } color[key] = gray; len[key] = 0; prev[key] = 0; queue->key = key; queue->next = NULL; while (queue) { edge* p_e = maze->head[queue->key].first; for (; p_e; p_e = p_e->next) if (color[p_e->key] == white) { //вылетает вот тут color[p_e->key] = gray; len[p_e->key] = len[queue->key] + 1; if (maze->head[p_e->key].type == exit) { t += 1; exit_rooms =realloc(exit_rooms, t * sizeof(int)); exit_rooms[t - 1] = p_e->key; } prev[p_e->key] = queue->key; last->next = malloc(sizeof(edge)); last = last->next; last->next = NULL; last->key = p_e->key; } color[queue->key] = black; queue = queue->next; } if (t > 0) { puts("These are the exit rooms and pathway lenght to them:"); for (; t > 0; --t) { printf("* The room with key %d, lenth is %d \n", exit_rooms[t - 1], len[exit_rooms[t - 1]]); int j = exit_rooms[t - 1]; printf(" The escape path way is: %d", exit_rooms[t - 1]); while (prev[j] != key) { printf(" <- %d", prev[j]); j = prev[j]; } printf(" <- %d.\n", key); } return 1; } else return 0; } // вылетает в поиске при таймировании int D_Show(beg* maze) { show(maze); return 1; } void show(beg* maze) { if (maze->size == 0) puts("Maze wasn't found"); int i; puts("These are the rooms and pathways from them:"); for (i = 0; i < maze->size; ++i) { if (maze->head[i].type != vacuum) { printf("* The room with key %d has type: %d, (x,y)= (%d, %d).", i, maze->head[i].type, maze->head[i].info->cord_x, maze->head[i].info->cord_y); if (!maze->head[i].first) printf("\n And there are no pathways from it. \n"); else { printf("\n Connected rooms has these keys: "); edge* p_e = maze->head[i].first; for (; p_e != NULL; p_e = p_e->next) printf(" %d", p_e->key); printf(".\n"); } } } } int D_Timing() { beg maze = init(); int N = 10, n = N, k, cnt = 100, i, m, aver = 0; clock_t first, last; srand(time(NULL)); while (n-- > 0) { rand_gen(&maze, cnt, cnt + (2 * rand() * time(NULL) % cnt)); D_Show(&maze); m = 0; first = clock(); for (i = 0; i < cnt; ++i) { k = cnt + 1; while ( (k >= maze.size) || k == 0) { k = rand() * rand() * (time(NULL) % 5) % 100; } m += find_exit(&maze, k); } last = clock(); //printf("%d items was found\n", m); aver += (last - first); printf("test #%d, number of nodes = %d, time = %d\n", N - n, (N - n) * cnt, last - first); } printf("Aver.time = %d\n", aver / N); deleteall(&maze); return 1; } int D_File_in(beg* maze) { //Путь к файлу puts("Put file name pls!"); char* maze_path = getStr(); if (&maze_path == NULL) { printf("Wrong filename or EOF. "); printf("Exit"); return 0; } //Открытие файла FILE* bfp = NULL; fopen_s(&bfp, maze_path, "r+b"); if (!bfp) printf("No file with this path"); //Работа с файлом if (bfp) { *maze = read_maze(bfp); D_Show(maze); fclose(bfp); printf("File was cloased"); } else printf("Something gone wrong, check access permissions."); FileOpenFlag = 1; return 1; } beg read_maze(FILE* file) { beg maze = init(); fseek(file, 0, SEEK_SET); int size; if ( fread(&size, sizeof(int), 1, file) == 1) { int i; for (i = 0; i < size; ++i) { room_type t; int x,y,f=0; if ( fread(&t, sizeof(room_type), 1, file) == 1 && fread(&x, sizeof(int), 1, file) == 1 && fread(&y, sizeof(int), 1, file) == 1 ){ if (t == exit) f = 1; add_room(&maze, x, y, f); } int k; while ( fread(&k, sizeof(int), 1, file) == 1) { if (k == -1) break; else add_pathway(&maze, i, k); } } } return maze; } int D_File_out(beg* maze) { //Путь к файлу puts("Put file name pls!"); char* maze_path = getStr(); if (&maze_path == NULL) { printf("Wrong filename or EOF. "); printf("Exit"); return 0; } //Открытие файла FILE* bfp = NULL; fopen_s(&bfp, maze_path, "r+b"); if (!bfp) fopen_s(&bfp, maze_path, "w+b"); //Работа с файлом if (bfp) { if (!write_maze(maze, bfp)) printf("Something gone wrong. Start again pls."); fclose(bfp); printf("File was cloased"); } else printf("Something gone wrong, check access permissions."); FileOpenFlag = 0; return 1; } int write_maze(beg* maze, FILE* file) { fseek(file, 0, SEEK_SET); if (maze->size == 0) return 0; fwrite(&maze->size, sizeof(int), 1, file); int i; const int end_key = -1; for (i = 0; i < maze->size; ++i) { fwrite(&maze->head[i].type, sizeof(room_type), 1, file); fwrite(&maze->head[i].info->cord_x, sizeof(int), 1, file); fwrite(&maze->head[i].info->cord_y, sizeof(int), 1, file); edge* p_e = maze->head[i].first; for (; p_e != NULL; p_e = p_e->next) fwrite(&p_e->key, sizeof(int), 1, file); fwrite(&end_key, sizeof(int), 1, file); } return 1; } int D_Random_Generation(beg* maze) { int k1, k2, n; puts("Enter how many rooms you want to add: -->"); n = getInt(&k1); if (n == 0) return 0; puts("Enter how many pathways you want to add: -->"); n = getInt(&k2); if (n == 0) return 0; rand_gen(maze, k1, k2); return 1; } void rand_gen(beg* maze, int num1, int num2) { int i, n, x, y, f; for (i = 0; i < num1 ; ) { n = 0; while (n == 0) { x = (rand() * rand() * time(NULL) % (num1 + maze->size)) * TF_gen(); y = (rand() * rand() * time(NULL) % (num1 + maze->size)) * TF_gen(); f = TF_gen() * (-1); n = add_room(maze, x, y, f); } ++i; } int k1, k2; for (i = 0; i < num2; ) { n = 0; while (n == 0) { k1 = 0; k2 = 0; while ((k1 >= maze->size) || k1 == 0 || (k2 >= maze->size) || k2 == 0) { k1 = rand() * rand() * time(NULL) % maze->size; k2 = rand() * rand() * time(NULL) % maze->size; } n = add_pathway(maze, k1, k2); } ++i; } } int TF_gen() { int p = rand(); while (p > 10) { p /= 10; } if (p < 6) p = 1; else p = -1; return p; }
Raw Text
-
Sex In Overdrive Maddy Black, Jennifer Mendez / Brazzers
16 min ago
-
Untitled
41 min ago
-
Thai whore cheats on her boyfriend with the masseur
46 min ago
-
Untitled
1 hour ago
-
Adult Telegram Channels
1 hour ago
-
LATINA PUSSY SET ON FIRE! - WILD PASSIONATE SEX - INTENSE CHEMISTRY - FEMALE ORGASMS - VERONICA LEAL
1 hour ago
-
SDF DS FDS FDS FDS FDSF DS
1 hour ago
-
rqwgrqwwtgiqwt
1 hour ago
-
dr5drdf ghgdfhgjhg
1 hour ago
-
POV - Hardcore MFF threesome with sub sluts Lucette Nice and Kitana Lure
1 hour ago