首页 > 代码库 > 营救公主(深度优先搜索算法)
营救公主(深度优先搜索算法)
Price.h
#ifndef __OJ_H__#define __OJ_H__#include <vector>#include<string.h> #include <iostream>#include <stack>using namespace std;enum{ EAST = 1, SOUTH = 2, WEST = 3, NORTH = 4, BLOCK = 4,};// 节点坐标类型typedef struct{ // 坐标 int x; int y;}structLoc;// 节点类型typedef struct{ // 是否已经标记过,true表示已标记 bool bMark; char chPoint;}structPoint;// 栈元素类型typedef struct{ // 搜索深度 int depth; // 坐标 int x; int y; // 搜索方向 int dir;}StackType;int SSavep(char *visited, int t, int n, int m);// 当前节点是否可通bool IsBlock(structLoc curLoc, vector<vector<structPoint>> vecMaze);// 节点标记为已走过void setFootStep(structLoc curLoc, vector<vector<structPoint>>& vecMaze);// 到达终点bool IsEnd(structLoc curLoc);// 下一个节点void GetNextPoint(int x, int y, structLoc& curLoc, int dir);// 深度优先搜素int DepthFirstSearch(structLoc& curLoc, int dir, int idepth, int iTime, StackType sElement, vector<vector<structPoint>>& vecMaze);#endif
price.cpp
#include<stdio.h> #include<string.h> #include "OJ.h" // 起点和终点structLoc PointS, PointP;/*Description 每组测试数据以三个整数N,M,T(0<n, m≤20, t>0)开头,分别代表迷宫的长和高,以及公主能坚持的天数。 紧接着有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, int m){ // 构造迷宫vector;找出S和P的位置 vector<vector<structPoint> > vecMaze; for (int i = 0; i < m; i++) { vector<structPoint> vecTemp; 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; // 节点栈 stack<StackType> stackPoint; 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<vector<structPoint>> 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<vector<structPoint>>& vecMaze){ vecMaze.at(curLoc.y).at(curLoc.x).bMark = true;}bool IsEnd(structLoc curLoc){ if ((curLoc.x == PointP.x) && (curLoc.y == PointP.y)) { return true; } return false;}void GetNextPoint(int x, int y, structLoc& curLoc, int dir){ 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 { }}
营救公主(深度优先搜索算法)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。