|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include"stdafx.h"
#include<stack>
#include<iostream>
using namespace std;
#define ROWS 11 //行
#define COLUMNS 9 //列
struct MapNode
{
int value;//地图的值
bool bUsed;//标记是否走过
int preDir;//尝试要走的方向
};
struct MapPoint //地图的点 做终点 起点 二维数组的下标
{
int row;//行
int col;//列
};
enum tryDirEnum
{
em_Down,//下
em_Up,//上
em_Left,//左
em_Right//右
};
int gMap[ROWS][COLUMNS] = {
{ 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 0, 1, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 1, 0, 1, 1, 0, 1, 1 },
{ 1, 0, 1, 0, 0, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 0, 0, 0, 1 },
{ 1, 0, 1, 0, 1, 0, 1, 0, 1 },
{ 1, 0, 0, 0, 1, 1, 1, 0, 1 },
{ 1, 0, 1, 0, 0, 0, 1, 0, 0 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1 }
};
MapNode gMapNOdes[ROWS][COLUMNS];//Day01 地图节点
void InitMapNodes();//Day02 初始化地图节点
int main(void)
{
InitMapNodes();//Day01 初始化地图
MapPoint startPos = { 1, 1 };//Day02 标记地图的起点
MapPoint endPos = { 9, 8 };//Day02 终点
stack<MapPoint>pathStack;//Step01 将走过的点入栈
pathStack.push(startPos);
bool bFindEnd = false;//判断是否找到终点
MapPoint currentPos = startPos;//currentPos点当前的位置
MapPoint tryPos = startPos;//tryPos点要尝试方向的位置
while (!bFindEnd)
{
tryPos = currentPos;//确定尝试点是当前节点
switch (gMapNOdes[currentPos.row][currentPos.col].preDir)//gMapNOdes[currentPos.row][currentPos.col]//当前点 尝试点尝试的方向
{
case em_Down://下
{
tryPos.row++;
gMapNOdes[tryPos.row][tryPos.col].preDir = em_Left;//赋值2
if (gMapNOdes[tryPos.row][tryPos.col].value == 0 && gMapNOdes[tryPos.row][tryPos.col].bUsed == false)
{
gMapNOdes[tryPos.row][tryPos.col].bUsed = true;//标记这个点被走过了
currentPos = tryPos;
pathStack.push(currentPos);
}
}
break;
case em_Up://上
{
++tryPos.row;
if (gMapNOdes[tryPos.row][tryPos.col].value == 0 && gMapNOdes[tryPos.row][tryPos.col].bUsed == false)
{
gMapNOdes[tryPos.row][tryPos.col].bUsed = true;
currentPos = tryPos;
pathStack.push(currentPos);//当前点入栈
}
else//上走是最后一个要走的方向 如果走不了需要回退
{
pathStack.pop();//把当前位置的数据弹出 栈顶元素
if (!pathStack.empty())
currentPos = pathStack.top();//栈顶的下来一个元素既前一个点的位置
}
}
break;
case em_Left:
{
--tryPos.col;
gMapNOdes[tryPos.row][tryPos.col].preDir = em_Right;//不满足条件,Break 去尝试右走
if (gMapNOdes[tryPos.row][tryPos.col].value == 0 && gMapNOdes[tryPos.row][tryPos.col].bUsed == false)
{
gMapNOdes[tryPos.row][tryPos.col].bUsed = true;
currentPos = tryPos;
pathStack.push(currentPos);
}
}
break;
case em_Right:
{
++tryPos.col;
gMapNOdes[tryPos.row][tryPos.col].preDir = em_Up;
// ++tryPos.col;不满足条件 在尝试上走
if (gMapNOdes[tryPos.row][tryPos.col].value == 0 && gMapNOdes[tryPos.row][tryPos.col].bUsed == false)
{
gMapNOdes[tryPos.row][tryPos.col].bUsed = true;
currentPos = tryPos;
pathStack.push(currentPos);
}
}
break;
}
if (currentPos.col == endPos.col && currentPos.row == endPos.row)
bFindEnd = true;//退出循环
if (pathStack.empty())//栈空 结束循环
break;
}
if (bFindEnd == true)
{
cout << "找到了终点" << endl;
for (unsigned int i = 0; i < pathStack.size(); ++i)
{
MapPoint Top = pathStack.top();
cout << "(" << Top.row << "," << Top.col << ")" << " ";
pathStack.pop();
}
cout << endl;
}
else
{
cout << "找不到终点!!!!" << endl;
}
return 0;
}
//Day02 初始化地图节点
void InitMapNodes()
{
for (int i = 0; i < ROWS; ++i)
{
for (int j = 0; j < COLUMNS; ++j)
{
gMapNOdes[i][j].value = gMap[i][j];
}
}
gMapNOdes[ROWS][COLUMNS].preDir = 0;
gMapNOdes[ROWS][COLUMNS].bUsed = false;
}
在当前点走到下标2,1位置时,尝试点tryPos 判断左走em_Left不满足条件的时候,就尝试右走em_Right; gMapNOdes[ROWS][COLUMNS].preDir=em_Right;//赋值为去尝试右走
还没退出当前switch执行的位置,gMapNOdes[ROWS][COLUMNS].preDir是==3的;为什么break后,循环在进入到wsthch的时候switch (gMapNOdes[currentPos.row][currentPos.col].preDir)这里的preDir怎么又变成2了?
|
|