#include#include#include"OJ.h"
//起点和终点
structLoc PointS, PointP;/*Description
每组测试数据以三个整数N,M,T(00)开头,分别代表迷宫的长和高,以及公主能坚持的天数。
紧接着有M行,N列字符,由".","*","P","S"组成。其中 "." 代表能够行走的空地。 "*" 代表墙壁,Jesse不能从此通过。
"P" 是公主所在的位置。 "S" 是Jesse的起始位置。 每个时间段里Jesse只能选择“上、下、左、右”任意一方向走一步。
Prototype
int SSaveP (int *maze[], int M, int n, int t)
Input Param
maze 迷宫布局(这里用二维数组实现布局)
M 迷宫(数组)行数
N 迷宫(数组)列数
T 公主能坚持的天数
Output Param
无
Return Value
0 可以救出公主
-1 不可以救出公主*/
int SSavep(char *visited, int t, int n, intm)
{//构造迷宫vector;找出S和P的位置
vector >vecMaze;for (int i = 0; i < m; i++)
{
vectorvecTemp;for (int j = 0; j < n; j++)
{if ('S' == visited[(i * n) +j])
{
PointS.x=j;
PointS.y=i;
}if ('P' == visited[(i * n) +j])
{
PointP.x=j;
PointP.y=i;
}
structPoint sPoint;
sPoint.chPoint= visited[(i * n) +j];
sPoint.bMark= false;
vecTemp.push_back(sPoint);
}
vecMaze.push_back(vecTemp);
}//当前节点坐标
structLoc curLoc;
curLoc.x=PointS.x;
curLoc.y=PointS.y;//搜索深度
int iDepth = 0;//栈元素
StackType sElement;//节点栈
stackstackPoint;do{if (!IsBlock(curLoc, vecMaze))
{
setFootStep(curLoc, vecMaze);
sElement.depth=iDepth;
sElement.dir=EAST;
sElement.x=curLoc.x;
sElement.y=curLoc.y;//当前节点入栈
stackPoint.push(sElement);if(IsEnd(curLoc))
{return sElement.depth > t?-1:0;
}else{//下一个节点
GetNextPoint(sElement.x, sElement.y, curLoc, EAST);
iDepth++;
}
}else{if (!stackPoint.empty())
{//回退到上一层深度继续搜索
sElement =stackPoint.top();
stackPoint.pop();//节点四个方向都不通,弹出栈
while ((BLOCK == sElement.dir) && (!stackPoint.empty()))
{
sElement=stackPoint.top();
stackPoint.pop();
}//如果还有其他方向没搜索过,换一个方向搜索
if (BLOCK !=sElement.dir)
{
sElement.dir++;
stackPoint.push(sElement);
GetNextPoint(sElement.x, sElement.y, curLoc, sElement.dir);
}
}
}
}while(!stackPoint.empty());//没有找到通路
return -1;
}bool IsBlock(structLoc curLoc, vector>vecMaze)
{//遇到边界
if ((curLoc.x < 0)|| (curLoc.x >= (int)vecMaze.front().size())|| (curLoc.y < 0)|| (curLoc.y >= (int)vecMaze.size()))
{return true;
}//遇到墙
structPoint sPoint =vecMaze.at(curLoc.y).at(curLoc.x);if (sPoint.chPoint == '*')
{return true;
}//已经标记过
if (true ==sPoint.bMark)
{return true;
}return false;
}void setFootStep(structLoc curLoc, vector>&vecMaze)
{
vecMaze.at(curLoc.y).at(curLoc.x).bMark= true;
}boolIsEnd(structLoc curLoc)
{if ((curLoc.x == PointP.x) && (curLoc.y ==PointP.y))
{return true;
}return false;
}void GetNextPoint(int x, int y, structLoc& curLoc, intdir)
{if (EAST ==dir)
{
curLoc.x= x + 1;
curLoc.y=y;
}else if (SOUTH ==dir)
{
curLoc.x=x;
curLoc.y= y + 1;
}else if (WEST ==dir)
{
curLoc.x= x - 1;
curLoc.y=y;
}else if (NORTH ==dir)
{
curLoc.x=x;
curLoc.y= y - 1;
}else{
}
}