Ahoj, snažím se najít nejkratší cestu z bludiště prohledáváním do šířky. Program už projde všechny políčka a najde cíl, tady je kód:
#include <fstream>
#include <queue>
#include <iostream>
using std::queue;
struct s_maze
{
char place;
int c;
int r;
bool used;
};
int main()
{
using std::ifstream;
using std::ofstream;
ifstream fin;
ofstream fout;
fin.open("maze.in");
if (fin.is_open() == false)
return 0;
int row, column, start_c, start_r;
fin >> row >> column;
s_maze maze[50][50];
s_maze test_maze;
for (int c = 0; c < column; ++c)
{
for (int r = 0; r < row; ++r)
{
fin >> maze[c][r].place;
maze[c][r].used = false;
maze[c][r].c = c;
maze[c][r].r = r;
if (maze[c][r].place == 'S')
{
start_c = c;
start_r = r;
}
}
}
queue <s_maze> q;
q.push(maze[start_c][start_r]);
while(q.empty() != true)
{
test_maze = q.front();
maze[test_maze.c][test_maze.r].used = true;
std::cout << test_maze.c <<" " << test_maze.r << std::endl;
q.pop();
if (test_maze.place == 'C')
{
std::cout << "exit at " << test_maze.c << " " << test_maze.r;
std::cin.get();
return 0;
}
if (test_maze.c - 1 >= 0)
{
if (maze[test_maze.c - 1][test_maze.r].place != '#' && (maze[test_maze.c - 1][test_maze.r].place == '.' || maze[test_maze.c - 1][test_maze.r].place == 'S' || maze[test_maze.c - 1][test_maze.r].place == 'C') && (maze[test_maze.c - 1][test_maze.r].used == 0))
{
q.push(maze[test_maze.c - 1][test_maze.r]);
}
}
if (test_maze.c + 1 <= column)
{
if (maze[test_maze.c + 1][test_maze.r].place != '#' && (maze[test_maze.c + 1][test_maze.r].place == '.' || maze[test_maze.c + 1][test_maze.r].place == 'S' || maze[test_maze.c + 1][test_maze.r].place == 'C') && (maze[test_maze.c + 1][test_maze.r].used == 0))
{
q.push(maze[test_maze.c + 1][test_maze.r]);
}
}
if (test_maze.r + 1 <= row)
{
if (maze[test_maze.c][test_maze.r + 1].place != '#' && (maze[test_maze.c][test_maze.r + 1].place == '.' || maze[test_maze.c][test_maze.r + 1].place == 'S' || maze[test_maze.c][test_maze.r + 1].place == 'C') && (maze[test_maze.c][test_maze.r + 1].used == 0))
{
q.push(maze[test_maze.c][test_maze.r + 1]);
}
}
if (test_maze.r - 1 >= 0)
{
if (maze[test_maze.c][test_maze.r - 1].place != '#' && (maze[test_maze.c][test_maze.r - 1].place == '.' || maze[test_maze.c][test_maze.r - 1].place == 'S' || maze[test_maze.c][test_maze.r - 1].place == 'C') && (maze[test_maze.c][test_maze.r - 1].used == 0))
{
q.push(maze[test_maze.c][test_maze.r - 1]);
}
}
}
for (int c = 0; c < column; ++c)
{
for (int r = 0; r < row; ++r)
{
std::cout << maze[c][r].place;
}
std::cout << std::endl;
}
std::cout << start_r << " " << start_c;
std::cin.get();
return 0;
}
V tom maze.in je počet sloupců, řádků a bludiště -
8 3
S#....#F
.#.##.#.
........
Dá se nějak vylepšit ten vstup když mám velikost v souboru(abych nemusel používat 50x50 a testovat jestli je tam platný symbol)?
Jak bych měl sledovat cestu? Přemýšlím o lineárním spojovém seznamu ale nevím co dělat když se ty cesty větví - chci vypsat cestu v souřadnicích.
Díky