走迷宫的规则:
当前坐标是(i, j)下一步可以往四个方向行走,上下左右。在迷宫数组 0标识可以走,1标识不能走 2 标记已经走过 3标识回退的路
穷举法走出迷宫有两种方法:
方法一:用栈模拟
具体思路:
代码如下:
struct Pos
{
int _row;
int _col;
};
void GetMaze(int* a, int n)
{
assert(a);
FILE* fout = fopen("MazeMap.txt", "r");
assert(fout);
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; )
{
char ch = fgetc(fout);
if (ch == '1' || ch == '0')
{
a[i*n + j] = ch - '0';
++j;
}
}
}
}
void PrintMaze(int* a, int n)
{
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
cout << a[i*n + j]<<" ";
}
cout << endl;
}
cout << endl;
}
bool CheckIsAccess(int* a, int n, const Pos& next)
{
int row = next._row;
int col = next._col;
if (row >= 0 && row < n
&&col >= 0 && col < n
&&a[row*n + col] == 0)
{
return true;
}
else
{
return false;
}
}
bool SearchMazeSize(int* a, int n, Pos entry, stack<Pos>& paths)
{
assert(a);
//Pos cur = entry;
paths.push(entry);
while (!paths.empty())
{
Pos cur = paths.top();
a[cur._row*n + cur._col] = 2;
if (cur._row == n - 1)
{
return true;
}
Pos next = cur;
//上
next._row--;
if (CheckIsAccess(a, n, next))
{
paths.push(next);
continue;
}
//下
next = cur;
next._row++;
if (CheckIsAccess(a, n, next))
{
paths.push(next);
continue;
}
//左
next = cur;
next._col--;
if (CheckIsAccess(a, n, next))
{
paths.push(next);
continue;
}
//右
next = cur;
next._col++;
if (CheckIsAccess(a, n, next))
{
paths.push(next);
continue;
}
a[cur._row*n + cur._col] = 3;
paths.pop();
}
return false;
}
测试用例:
void Test1()
{
int a[N][N] = { 0 };
GetMaze((int*)a, N);
cout << "迷宫:" << endl;
PrintMaze((int*)a, N);
stack<Pos> paths;
Pos entry = { 2,0 };//入口坐标
cout << "是否有通路?" << SearchMazeSize((int*)a, N, entry, paths) << endl;
cout << endl;
PrintMaze((int*)a, N);
}
运行结果: