思路:递归。从笨笨熊现在的房子处开始,分别从上下左右四个方向进行递归搜索。在递归的时候,要注意不要像来的方向返回去找。如当前位置为(1,2),向上查找时,到(0,2)位置处,在对(0,2)进行查找时,就不要向下再次查找(1,2)位置,不然会形成死循环。这个问题在代码中由如下体现: 1 != iDir + i && 5 != iDir + i 这里特别说明下: 根据定义的方向数组,int iDirection[4][2] = {{0,-1}, {0, 1}, {-1, 0}, {1,0}};//方向, 左右上下 iDir是取二维数组中行的下标,所以,iDir= 0,表示向左;iDir=1,向右;iDir=2,向上;iDir=3,向下 iDir表示上一个搜索位置到当前搜索位置的方向,如当前为(1,2),如果上一个为(1,1),此时iDir=2,表示从(1,1)到(1,2)是向右搜索的。 i是对当前位置进行搜索的四个方向,也是iDirection[4][2]中一维的下标。接着刚才的例子,在对(1,2)进行搜索时,就不能回到(1,1),即 i 在遍历四个方向时,不能向左搜索,即不能等于 0, 所以 i+iDir != 1; 上下不能返回查找, 即i+ iDir != 5;(读者可自行分析) PS:如果数组iDirection[4][2]中定义的方向顺序不一样,这里 #include <stdio.h>
#include <string.h>
#include <malloc.h>
//查找路径
//iRow:地图的总行数
//iCol:地图的总列数
// chInMap: 地图,以为数组形式输入
//iCur: 当前所在行
//iCurCol: 当前所在列
//iDir: 上个位置到当前位置的方向
//iIsFirst: 是否是第一次调用,如果是第一次调用,需要找到起点(即老房子所在行列)
int FindPath(int iRow, int iCol, char *chInMap, int iCurRow, int iCurCol, int iIsFirst, int iDir)
{
if (iCurRow >= iRow || iCurCol >= iCol || iCurCol < 0 || iCurRow < 0)
{
return 0;
}
int iDirection[4][2] = {{0,-1}, {0, 1}, {-1, 0}, {1,0}};//方向, 左右上下
int iIsBeak = 0;
if(iIsFirst == 1)
{
int iRow_i, iCol_i;
//找到老房子
for (iRow_i = 0; iRow_i<iRow; iRow_i++)
{
for (iCol_i=0; iCol_i<iCol; iCol_i++)
{
if (chInMap[iRow_i * iCol + iCol_i] == 'B')
{
iIsBeak = 1;
break;
}
}
if (iIsBeak == 1)
{
break;
}
}
iCurRow = iRow_i;
iCurCol = iCol_i;
}
int i=0;
for (; i<4; i++)
{
//到达新居
if (chInMap[(iCurRow + iDirection[i][0])* iCol + iCurCol + iDirection[i][1]] == 'H')
{
return 1;
}//路可行,且不是当前的的来路
if (chInMap[(iCurRow + iDirection[i][0]) * iCol + iCurCol + iDirection[i][1]] == '-'
&& 1 != iDir + i && 5 != iDir + i)
{
if(1 == FindPath(iRow, iCol, chInMap, iCurRow + iDirection[i][0], iCurCol + iDirection[i][1], 0, i))
{
return 1;
}
}//换一个方向试探
else
{
continue;
}
}
return 0;
}
void main()
{
int iRow = 0;
int iCol = 0;
scanf("%d", &iRow);
scanf("%d", &iCol);
char * pchTmp = (char *)(malloc)(sizeof(char) * (iCol + 1));
char * pchMap = (char *)(malloc)(sizeof(char) * (iCol * iRow + 1));
char * pchMapTmp = pchMap;
if (NULL == pchTmp || NULL == pchMap)
{
return;
}
int i=0;
for (; i<iRow; i++)
{
scanf("%s", pchTmp);
memcpy(pchMapTmp, pchTmp, sizeof(char) * (iCol + 1));
pchMapTmp += sizeof(char) * (iCol);
}
int iRst;
iRst = FindPath(iRow, iCol, pchMap, 0, 0, 1, -5);
if (iRst == 1)
{
printf("Y\n");
}
else
{
printf("N\n");
}
}
是不同的。 |