迷宫问题,是一个非常经典的问题,我们通过栈这种数据结构来解决这个问题。
1.设计思路
我们这里采用回溯法解决迷宫问题,即从入口出发,顺某一方向试探,若能走通,则继续往前走,否则原路返回,换另一个方向继续试探,直至走出去为止。
2.剖析实例
例如,我们给定下面这样的迷宫:
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
0 0 0 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1
1 1 0 0 0 0 0 0 1 1
1 1 0 1 1 1 1 0 1 1
1 1 0 1 1 1 1 0 1 1
1 1 0 1 1 1 1 1 1 1
我们解决的问题就是要简单的从这个迷宫中走出来,所以我们应该首先呢,将所给的这个迷宫保存下来,这里我们采用数组就可以了。然后我们需要对数组当中的这些值进行修改。
2.1保存迷宫
我们首先在一个txt文件当中保存这个迷宫,然后再程序当中,我们所需要做的就是进行读取每一个字符,然后对应的在数组当中保存所对应的数字。
void GetMaze(int *arr)
{
FILE * mz = fopen("MazeMap.txt", "r");
assert(mz != NULL);
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N;)
{
//对文件中的每个字符进行获取,如果获取到的字符是我们要的,进行处理保存到数组中,如果不是,那么结束这次循环,读取下一个字符。
char ch = fgetc(mz);
if (ch == '0' || ch == '1')
{
//在这里我们采用一维数组的方式来进行访问,特别要记住,二位数组其实在内存分布上就是一个一维数组,另外,不要忘记我们取出来的是字符,要把它变成数字保存在数组当中。
arr[i*N + j] = ch-'0';
j++;
}
continue;
}
}
fclose(mz);
}
2.2 打印迷宫
我们将这个迷宫保存到了数组当中,为了我们观察前后走出迷宫的过程,我们要吧这个数组打印出来才可以。
void PrintMaze(int *arr)
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
cout << arr[i*N + j]<<" ";
}
cout << endl;
}
}