Консольный Лабиринт - готовое решение - 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;
}

Объяснение кода листинга программы

  1. Задача программы - реализовать консольный лабиринт и продемонстрировать работу волнового алгоритма для его прохождения.
  2. Переменные:
    • size_row, size_col - размеры лабиринта (10x10).
    • Ni, Nk - номер текущей и максимальной итерации.
    • y, n - точки проходимости и непроходимости соответственно.
    • s, e - точки старта и финиша соответственно.
    • i, j - координаты в лабиринте.
    • R[i][j] - массив, представляющий лабиринт, где 255 - непроходимая клетка, 253 - проходимая клетка, 254 - точка назначения.
  3. Действия программы:
    • Вывод лабиринта до начала алгоритма.
    • Цикл, выполняющийся до достижения максимальной итерации 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 для завершения программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.5 из 5
Похожие ответы