Консольный Лабиринт - готовое решение - C (СИ)
Формулировка задачи:
Вот может надо кому. Сам писал.
#include "stdafx.h" #include <string.h> #include <stdio.h> #include <conio.h> #include <iostream> #include <Windows.h> using namespace std; unsigned char map[12][20]={ {1,1,1,1,1,1,1,1,1,1,1,1}, {1,0,0,0,0,0,0,0,0,0,0,1}, {1,0,0,1,1,1,1,0,1,1,0,1}, {1,0,0,0,0,0,0,0,1,1,0,1}, {1,0,1,1,1,1,1,1,1,1,0,1}, {1,0,1,0,0,0,0,0,1,1,0,1}, // лабиpинт {1,0,1,0,'H',0,1,0,0,1,0,1}, // 0 - проход {1,0,1,0,1,0,0,1,0,1,0,1}, {1,0,1,1,0,0,0,1,0,1,0,1}, // H конеч точка) {1,0,1,0,1,1,1,0,0,1,0,1}, // 1 стена {1,0,0,0,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1,1,1}}; unsigned char oke[12][20]; char wave(unsigned char n,int &a,int &b) { char flag = 0; for (int i = 1; i < 11; i++) { for (int j = 1; j < 19; j++) { if (map[j][i] == n) { if (map[j + 1][i] == 0) { map[j + 1][i] = n + 1; flag = 1; } if(map[j+1][i]=='H') {a=j; b=i; flag=0; return flag;} if (map[j - 1][i] == 0) { map[j - 1][i] = n + 1; flag = 1; } if(map[j-1][i]=='H') {a=j; b=i; flag=0; return flag;} if (map[j][i + 1] == 0) { map[j][i + 1] = n + 1; flag = 1; } if(map[j][i+1]=='H') {a=j; b=i; flag=0; return flag;} if (map[j][i - 1] == 0) { map[j][i - 1] = n + 1; flag = 1; } if(map[j][i-1]=='H') {a=j; b=i; flag=0; return flag;} } //a=j; b=i; } } return flag; } char step(int &x, int &y) { if (map[x][y] == 'H') //конеч точка return 0; if (map[x+1][y] > map[x][y]) { x++; return 1; } if (map[x-1][y] > map[x][y]) { x--; return 1; } if (map[x][y+1] > map[x][y] ) { y++; return 1; } if (map[x][y-1] > map[x][y]) { y--; return 1; } return 0; } char stepback(int &x, int &y) { if (map[x][y] == 2) //конеч точка return 0; if (map[x+1][y] <map[x][y] && map[x+1][y]!=1 ) { x++; return 1; } if (map[x-1][y] < map[x][y]&& map[x-1][y]!=1 ) { x--; return 1; } if (map[x][y+1] <map[x][y]&& map[x][y+1]!=1 ) { y++; return 1; } if (map[x][y-1] < map[x][y]&& map[x][y-1]!=1 ) { y--; return 1; } return 0; } void main() { HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); //SetConsoleTextAttribute(hStdOut, (WORD)((0 << 4) | 2)); for(int i=0;i<12;i++) for(int j=0;j<12;j++) oke[i][j]=map[i][j]; int a=0; int b=0; int x=1, y=1; //начальная точка map[x][y]=2; unsigned char n=2; SetConsoleTextAttribute(hStdOut, (WORD)((0 << 4) | 2)); for(int i=0;i<12;i++) {printf("\n"); for(int j=0;j<12;j++) if(map[i][j]!='H') printf("%3d",map[i][j]); else printf("%3c",map[i][j]); } printf("\n"); printf("\n"); SetConsoleTextAttribute(hStdOut, (WORD)((0 << 4) | 10)); while(wave(n,a,b)) { n++; //printf("(%d,%d)", a,b); //cout <<"("<<a<<","<<b<<")"; } if(a!=0 && b!=0) cout <<"("<<a<<","<<b<<")"; else cout<<"PUTI NET"; /* while(step(x,y)) { } */ x=a; y=b; oke[x][y]='*'; while(stepback(x,y)) { oke[x][y]='*'; cout <<"("<<x<<","<<y<<")"; } /* for(int i=0;i<12;i++) {printf("\n"); for(int j=0;j<12;j++) printf("%3d",map[i][j]); } printf("\n"); printf("\n"); */ SetConsoleTextAttribute(hStdOut, (WORD)((0 << 4) | 3)); for(int i=0;i<12;i++) {printf("\n"); for(int j=0;j<12;j++) {if(oke[i][j]=='*' || oke[i][j]=='H' ) {SetConsoleTextAttribute(hStdOut, (WORD)((0 << 4) | 10)); printf("%3c",oke[i][j]); /*Beep(2500,100);*/SetConsoleTextAttribute(hStdOut, (WORD)((0 << 4) | 3));} else printf("%3d",oke[i][j]); //Beep(1000,5); //Sleep(10); } //system("cls"); //Beep(1000,5); //Sleep(10); } printf("\n"); SetConsoleTextAttribute(hStdOut, (WORD)((15 << 0) | 3)); printf("LABIRINT COMPLETED"); /* printf("\n"); SetConsoleTextAttribute(hStdOut, (WORD)((15 << 0) | 15)); printf("|||||||||||||||||"); printf("\n"); SetConsoleTextAttribute(hStdOut, (WORD)((9 << 0) | 9)); printf("|||||||||||||||||"); printf("\n"); SetConsoleTextAttribute(hStdOut, (WORD)((12 << 0) | 12)); printf("|||||||||||||||||"); */ getch(); }
Решение задачи: «Консольный Лабиринт - готовое решение»
textual
Листинг программы
#include <iostream> #include <conio.h> using namespace std; int main() { const unsigned short size_row=10; const unsigned short size_col=10; int Ni=0; //номер итерации int Nk=300; //max кол-во итераций int y=255; //точка проходимости int n=253; //точка непроходимости int s=0; //точка старта int e=254; //точка финиша int i,j; int R[size_row][size_col]= { {n,y,y,y,y,y,y,y,y,y}, {n,y,n,y,n,n,n,n,n,y}, {n,s,n,y,n,n,n,n,n,y}, {n,n,n,y,n,n,n,n,n,y}, {n,n,n,y,n,n,n,n,n,y}, {y,y,y,y,n,n,n,n,n,y}, {y,n,n,y,n,n,n,n,n,y}, {n,n,n,y,n,n,n,n,n,y}, {n,n,n,y,n,n,n,n,n,y}, {n,n,n,y,y,y,y,y,y,e} }; cout<<"labirint do algoritma::"<<"\n \n"; for (i=0; i<size_row; i++) { for (j=0; j<size_col; j++) cout<<R[i][j]<<"\t"; } /*волновой алгоритм*/ while (Ni<Nk) { for (i=0; i<size_row; i++) { for (j=0; j<size_col; j++) /*запуск волны*/ if (R[i][j]==Ni) { if (R[i][j+1]==255) R[i][j+1]=Ni+1; if ((R[i][j-1]==255) and (j!=0)) R[i][j-1]=Ni+1; if (R[i+1][j]==255) R[i+1][j]=Ni+1; if (R[i-1][j]==255) R[i-1][j]=Ni+1; //if ((R[i+1][j]==253) or (R[i-1][j]==253) or (R[i][j+1]==253) or (R[i][j-1]==253)) /*if ((R[i+1][j]==254) or (R[i-1][j]==254) or (R[i][j+1]==254) or (R[i][j-1]==254)) { cout<<endl; cout<<endl; cout<<"labirint posle algoritma::"<<"\n \n"; for (i=0; i<size_row; i++) { for (j=0; j<size_col; j++) cout<<R[i][j]<<"\t"; } cout<<"Min dlina pyti="<<Ni<<" xodov(a)"; getch(); return 0; break; }*/ } } Ni++; } cout<<endl; cout<<endl; cout<<"labirint posle algoritma::"<<"\n \n"; for (i=0; i<size_row; i++) { for (j=0; j<size_col; j++) cout<<R[i][j]<<"\t"; } getch(); return 0; }
Объяснение кода листинга программы
- Задача программы - реализовать консольный лабиринт и продемонстрировать работу волнового алгоритма для его прохождения.
- Переменные:
- size_row, size_col - размеры лабиринта (10x10).
- Ni, Nk - номер текущей и максимальной итерации.
- y, n - точки проходимости и непроходимости соответственно.
- s, e - точки старта и финиша соответственно.
- i, j - координаты в лабиринте.
- R[i][j] - массив, представляющий лабиринт, где 255 - непроходимая клетка, 253 - проходимая клетка, 254 - точка назначения.
- Действия программы:
- Вывод лабиринта до начала алгоритма.
- Цикл, выполняющийся до достижения максимальной итерации Nk.
- Проверка каждой клетки лабиринта на непроходимость (R[i][j] == 255).
- Если клетка проходимая (R[i][j] == Ni), то изменение ее состояния на непроходимую (R[i][j] = Ni + 1).
- Если клетка имеет непроходимых соседей (R[i+1][j] == 255 and j != 0) или (R[i-1][j] == 255), то изменение ее состояния на непроходимую (R[i][j] = Ni + 1).
- Если клетка имеет непроходимых соседей (R[i+1][j] == 254 or R[i-1][j] == 254), то вывод лабиринта после текущей итерации и переход к следующей итерации.
- Вывод лабиринта после окончания алгоритма.
- Ввод с клавиатуры длины пути и нажатие клавиши
enter
для завершения программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д