/*
【问题描述】
从迷宫入口找出经过迷宫达到出口的一条路径
【探索规则】
①1代表不能通过的地方,0可以通过,2为入口,3为出口
②行走时从2开始,只能在0上行走,并且只能走到该位置的上下左右的0位置处。
③行走路线不能重复
【探索方法】
要解决此问题,从入口开始,分为4个方向去试探路径,如果遇到下一个方向为1,表示此路径不能行走,返回上一位置,再找其他路径;如果不是1可以继续向前行走,直到找到出口。
*/
#include <stdio.h>
#define m 3
#define n 4
int searchNext(int c[3][4], int k, int l);
void findEnterence(int c[3][4], int *k, int *l);
void searchPath(int c[3][4])
{
int k = 0, l = 0;
findEnterence(c, &k , &l);
searchNext(c, k, l);
}
int searchNext(int c[3][4], int k, int l)
{
if ((k >= 0 && k < m) || (l >= 0 && l < m))
{
printf("(%d, %d)", k, l);
if (c[k][l] == 3)//出口
{
return 1;
}
else
{
if (k - 1 >= 0)//方位为“上”的位置可到达 {
if ((c[k - 1][l] == 0) || (c[k - 1][l] == 3))
{
if (searchNext(c, k - 1, l))
{
//printf(" pass/n");
return 1;
//break;
}
}
}
if (l + 1 < n)//方位为“右”的位置可到达
{
if ((c[k][l + 1] == 0) || (c[k][l + 1] == 3))
{
if (searchNext(c, k, l + 1))
{
// printf(" pass/n");
return 1;
//break;
}
}
}
if (k + 1 < m)//方位为“下”的位置可到达
{
if ((c[k + 1][l] == 0) || (c[k + 1][l] == 3))
{
if (searchNext(c, k + 1, l))
{
//printf(" pass/n");
return 1;
//break;
}
}
}
if (l - 1 >= 0)//方位为“左”的位置可到达
{
if ((c[k][l - 1] == 0) || (c[k][l - 1] == 3))
{
if (searchNext(c, k, l - 1))
{
//printf(" pass/n");
return 1;
//break;
}
}
}
}
}
else
{
printf("no pass");
return 0;
}
}
void findEnterence(int c[3][4], int *k, int *l)
{
int i;
//*k保存行,*l保存列
//入口是否在左边
for (i = 0; i < m; i++)
{
if (c[i][0] == 2)
{
(*k) = i;
(*l) = 0;
return;
}
}
//入口是否在右边
for (i = 0; i < m; i++)
{
if (c[i][n - 1] == 2)
{
(*k) = i;
(*l) = n - 1;
return;
}
}
//入口是否在上边
for (i = 0; i < n; i++)
{
if (c[0][i] == 2)
{
(*k) = 0;
(*l) = i;
return;
}
}
//入口是否在底边
for (i = 0; i < n; i++)
{
if (c[m - 1][i] == 2)
{
(*k) = m - 1;
(*l) = i;
return;
}
}
}
int main()
{
//设定的迷宫
int c[m][n] = {{2, 1, 1, 1},
{0, 0, 0, 0},
{1, 1, 1, 3}};
searchPath(c);
printf("/n");
return 0;
}