Maze solving: Difference between revisions

m
m (→‎{{header|Wren}}: Minor tidy)
 
(One intermediate revision by one other user not shown)
Line 676:
=={{header|C}}==
See [[Maze_generation#C|Maze generation]] for combined gen/solve code.
 
 
=={{header|C#}}==
{{trans|Go}}
<syntaxhighlight lang="C#">
using System;
using System.Text;
 
public class Maze
{
private char[,] cells;
private char[,] hWalls; // Horizontal walls
private char[,] vWalls; // Vertical walls
private Random rand = new Random();
 
public Maze(int rows, int cols)
{
cells = new char[rows, cols];
hWalls = new char[rows + 1, cols]; // Include walls for the bottom
vWalls = new char[rows, cols + 1]; // Include walls for the right side
 
// Initialize walls
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
hWalls[i, j] = '-';
vWalls[i, j] = '|';
}
}
 
// Set the outer walls for the bottom and right
for (int i = 0; i < cols; i++)
{
hWalls[rows, i] = '-';
}
for (int i = 0; i < rows; i++)
{
vWalls[i, cols] = '|';
}
}
 
public override string ToString()
{
var builder = new StringBuilder();
 
for (int i = 0; i < cells.GetLength(0); i++)
{
// Top walls
for (int j = 0; j < cells.GetLength(1); j++)
{
builder.Append("+");
builder.Append(hWalls[i, j] == '-' ? "---" : " ");
}
builder.AppendLine("+");
 
// Side walls and cells
for (int j = 0; j < cells.GetLength(1); j++)
{
builder.Append(vWalls[i, j] == '|' ? "| " : " ");
char cell = cells[i, j] == '\0' ? ' ' : cells[i, j];
builder.Append(cell + " ");
}
builder.AppendLine("|");
}
 
// Bottom walls
for (int j = 0; j < cells.GetLength(1); j++)
{
builder.Append("+---");
}
builder.AppendLine("+");
 
return builder.ToString();
}
 
public void Generate()
{
Generate(rand.Next(cells.GetLength(0)), rand.Next(cells.GetLength(1)));
}
 
private void Generate(int r, int c)
{
cells[r, c] = ' ';
int[] dirs = { 0, 1, 2, 3 };
Shuffle(dirs);
 
foreach (int dir in dirs)
{
switch (dir)
{
case 0: // Up
if (r > 0 && cells[r - 1, c] == '\0')
{
hWalls[r, c] = ' ';
Generate(r - 1, c);
}
break;
case 1: // Down
if (r < cells.GetLength(0) - 1 && cells[r + 1, c] == '\0')
{
hWalls[r + 1, c] = ' ';
Generate(r + 1, c);
}
break;
case 2: // Right
if (c < cells.GetLength(1) - 1 && cells[r, c + 1] == '\0')
{
vWalls[r, c + 1] = ' ';
Generate(r, c + 1);
}
break;
case 3: // Left
if (c > 0 && cells[r, c - 1] == '\0')
{
vWalls[r, c] = ' ';
Generate(r, c - 1);
}
break;
}
}
}
 
private void Shuffle(int[] array)
{
for (int i = array.Length - 1; i > 0; i--)
{
int j = rand.Next(i + 1);
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
 
public void Solve(int startRow, int startCol, int endRow, int endCol)
{
if (Solve(startRow, startCol, endRow, endCol, -1))
{
cells[startRow, startCol] = 'S';
cells[endRow, endCol] = 'F';
}
}
 
private bool Solve(int r, int c, int endRow, int endCol, int dir)
{
if (r == endRow && c == endCol) return true;
 
// Up
if (dir != 1 && r > 0 && hWalls[r, c] == ' ' && Solve(r - 1, c, endRow, endCol, 0))
{
cells[r, c] = '^';
return true;
}
// Down
if (dir != 0 && r < cells.GetLength(0) - 1 && hWalls[r + 1, c] == ' ' && Solve(r + 1, c, endRow, endCol, 1))
{
cells[r, c] = 'v';
return true;
}
// Right
if (dir != 3 && c < cells.GetLength(1) - 1 && vWalls[r, c + 1] == ' ' && Solve(r, c + 1, endRow, endCol, 2))
{
cells[r, c] = '>';
return true;
}
// Left
if (dir != 2 && c > 0 && vWalls[r, c] == ' ' && Solve(r, c - 1, endRow, endCol, 3))
{
cells[r, c] = '<';
return true;
}
 
return false;
}
}
 
class Program
{
static void Main(string[] args)
{
var maze = new Maze(4, 7);
maze.Generate();
Random rand = new Random();
maze.Solve(rand.Next(4), rand.Next(7), rand.Next(4), rand.Next(7));
Console.WriteLine(maze);
}
}
</syntaxhighlight>
{{out}}
<pre>
+---+---+---+---+---+---+---+
| | | v S |
+ +---+ +---+ + +---+
| | | | > v |
+---+---+ + +---+---+ +
| | | | F |
+ +---+---+ + + + +
| | |
+---+---+---+---+---+---+---+
 
 
</pre>
 
=={{header|C++}}==
Line 1,434 ⟶ 1,636:
=={{header|EasyLang}}==
 
[https://easylang.dev/show/#cod=hZTbbqMwFEXf/RVb6ksuwjUpSIk0zI8gNKJgGitgRyZNm379yBeM3RnNvCT4XIy9zt7M4oujQl4SiQoH7DCbyB45GUycMTxjI5GB0XJLRi4x1Q0kdpDkCeS17S5vWr3LHowxctWqw3xWH7+m9ouDghIA3chbbR4GpSHMtrgp+L1MHIAYMNWiQQXmIwA+UWEjkCHfYlI95Jp6RKle3ONUp0alcTqd1tCk7hyf2GFAhgHPOOARr9ZKzbsbBuyQ03L591l7F/szj5xfwSjLCSVqGObaHLxGDoksxyaTWzQOxuRIXNW80Jjqq5rDRQMss+jDPge8oEATQyvQqw95U8j9eXpU0K3shbxBLDGhUcEeqa/7ZqFrnlGhr0XC25xqb3oaO5RW9iFopLAkIo5pSzSq6J6hOeVGCZe9yVdOPmZ2nlF74Ylg/qETL5I8zCKplWnVISzNG/8WQgZp1P5nSvrU2mVfd/Y2WcDnpa8zPWmCrFjObvAOgCNHSbg2WUXwhAWJvliYnRoXKtYNJpb64ZGEgxecCzo1klT/e6v4wuvfr2yD0N3I7fqFloSSt1G9tiMG627qva3GOzezZbGkxeCrVrFofnvXMmAL9zkxljio9P1OGA6Q3+I/W6oh0n9h1eTlcF7kUCSu2Jyxhxosujzkrmo2nz4nXGccoSOXmN4fP92Vg0HkN/U7LBtTu1+GU5hHu/1aF4GKuiM+EsfjMckEUlGYfneWK8qJOwezgjyQ3w== Run it]
[https://easylang.dev/show/#cod=hVTbjpswEH33V4zUF5Joqc2ClEjd/ghCFYvNggJ2ZLK73X59Z2xjTFt18wDMmZvn+EyW8ZeCJxAV0/gq4AgLIScQrCecc/gKmYYH4Hl1YJPSMNcNaAzU7Auw57a7vljzqiVwztnNmg6Wwbz/mFssk0POAKCbVGvpozcWRioLdwOhFuH4G3s0xgadPCD4+4lmNmJzcYDZSGwZXR+JS45vqaszE/a5XC4bNJs3hdWO0GNGjyMVWCCxtkirujtiRxB5tb6D183iHsuk1A0Z4YLlzPT9UtPBa5wLmRKQPegDNJ6M2TNxM8vKxlyjEQeNZJEhY50CHqGEJiWtBGneNRInwnkkgrbV0swwrtBoEXQnkrVsVnLpG3GJBKd006FOlNO4O8FSESQlrI6Exn1KclPJmDF5T1vOlJbkf/LqoasLFLVXtdPLf2QSNCLiVexi9T6qiCZ1/BeEh9Ak9r9dOri2LNduCFsSeBdVCKOUHc42UgZ/6358z1vO4tBsUwDuUyDEXh2VqOSVE7cKhO2X4WMHx0XwK4BP13oT/8nJvQziD5ZLGC1uqbMfUfA5e5nMczshvbTaeVhsM2ElvFme6hml5KM2qVh1f7U6khbnuXCv+XV9qpDvZeEJCiU+KWn6TfylkxJ4LQyrFsqQ6FciG3Ba0zvmRPRhO/rb86r1W4PKDk48F+V+++4njtuh/5C+ZyWj2NN6NyV9uvJbXMJTkg0bPRrO5/POE4lK4Jwlb1orHySYPwd3cizYbw== Run it]
 
<syntaxhighlight lang="text">
size = 15
n = 2 * size + 1
f = 100 / (n - 0.5)
len m[] n * n
#
background 000
proc show_maze . .
Line 1,462 ⟶ 1,664:
d[] = [ 1 2 3 4 ]
for i = 4 downto 1
d = randomrandint i
dir = offs[d[d]]
d[d] = d[i]
Line 1,482 ⟶ 1,684:
m[n * n - n + i] = 2
.
h = 2 * randomrandint 15 - n + n * 2 * randomrandint 15
m_maze h
m[endpos] = 0
Line 1,488 ⟶ 1,690:
make_maze
show_maze
#
proc mark pos col . .
x = (pos - 1) mod n
Line 1,507 ⟶ 1,709:
return
.
of = randomrandint 4 - 1
for h = 1 to 4
dir = (h + of) mod1 4
2,040

edits