代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
C/C++
】
迷宫最短路径算法
作者:
筱枚
/ 发布于
2016/8/14
/
813
#include "stdafx.h" #include "Path.h" Path::Path() { px = 0; py = 0; step = 0; flag = 0; fp = NULL; bp = NULL; findDes = ""; } int Path::Getflag() { return this->flag; } Path::Path(int ix, int iy, int ifg) { px = ix; py = iy; flag = ifg; fp = NULL; bp = NULL; step = 0; } void Path::AddFlag(Path* p, Path* p1) { flag = 2; fp = p; step = p->step + 1; //如果p1->bp == p 说明现在开始用p1连接所有的step=this->step的点 //否,则说明正连着,将此指针添加到父节点上 if (p1->bp != p) { this->bp = p1->bp; } p1->bp = this; } //添加当前节点的子节点的兄弟节点 void Path::AddChildBroNode(Path* pCur, Path* pBr,string findDes) { this->findDes = findDes; this->step = pCur->step + 1; this->fp = pCur; this->flag = 2; //如果不相等,则已经有兄弟节点了,将之前的兄弟节点组合一个链表 //如果相等,则说明该节点为当前节点的第一个字节点 if (pBr->bp != pCur) { this->bp = pBr->bp; } pBr->bp = this; } void Path::AddChildBroNode(Path* pCur, Path* pBr) { this->step = pCur->step + 1; this->fp = pCur; this->flag = 2; //如果不相等,则已经有兄弟节点了,将之前的兄弟节点组合一个链表 //如果相等,则说明该节点为当前节点的第一个字节点 if (pBr->bp != pCur) { this->bp = pBr->bp; } pBr->bp = this; } //void GetPath() //{ // Path *p1 = new Path(); // cout << "input two num that bigger 2,using space splite" << endl; // cin >> m >> n; // vector<vector<Path>>ce(m + 1, vector<Path>(n + 1)); // for (int j = 1;j <= n;j++) //j 为列数 // for (int i = 1;i <= m;i++) //i 为行数 // { // int f; // cin >> f; // getchar(); // ce[i][j] = Path(i, j, f); // } // cout << "迷宫地形图" << endl; // for (int j = 1;j <= n;j++) // { // for (int i = 1;i <= m;i++) // { // cout << ce[i][j].flag; // cout << "(" << ce[i][j].px << ce[i][j].py << ")" << ""; // } // cout << endl; // } // int bx, by; //输入确定的x,y值 // cout << "输入起点坐标和终点坐标" << flush; // cin >> bx >> by >> ex >> ey; // cout << bx << by << ex << ey << endl; // if (!ce[bx][by].Getflag()) // { // cout << "起点为空" << endl; // } // //p 当前的位置 // Path *p = &ce[bx][by]; // p1->bp = p; // //当前坐标位置 // int x = bx, y = by; // ce[bx][by].flag = 2; // while (p) // { // //if (dis(x, y, ex, ey) == 1) // //{ // // cout << "走到终点了!"; // // cout << "step=" << p->step; // // while (p) // // { // // cout << "路径如下=" << "x=" << p->px << "y=" << p->py<<endl; // // Path* fp = p->fp; // // p = fp; // // } // // break; // //} // // if (IsEnd(x, y, ex, ey)) // { // cout << "走到终点了!"; // cout << "step=" << p->step; // while (p) // { // cout << "路径如下=" << "x=" << p->px << "y=" << p->py << endl; // Path* fp = p->fp; // p = fp; // } // break; // } // // //对路径为1的点全方位扫描,并存储距离 // if (y > 1 && ce[x][y - 1].flag == 1) // ce[x][y - 1].AddFlag(p, p1); // if (y < n&&ce[x][y + 1].flag == 1) // ce[x][y + 1].AddFlag(p, p1); // if (x > 1 && ce[x - 1][y].flag == 1) // ce[x - 1][y].AddFlag(p, p1); // if (x < m&&ce[x + 1][y].flag == 1) // ce[x + 1][y].AddFlag(p, p1); // // if (p->bp) // { // p = p->bp; // x = p->px; // y = p->py; // } // else if (p != p1->bp) // { // p = p1->bp; // x = p->px; // y = p->py; // } // else // { // cout << "找不到合适的路径可以到达" << endl; // break; // } // // cout << "x:" << x << "y:" << y << endl; // } // delete p1; //} #pragma once #include <iostream> using namespace std; class Path { public: Path(); explicit Path(int ix, int iy, int ifg); public: int Getflag(); void AddFlag(Path* p, Path *p1); void AddChildBroNode(Path *pCurr, Path *pBr,string findDes); void AddChildBroNode(Path *pCurr, Path *pBr); public: int px; int py; int flag; //0:不通 1:通 2:走过该点 Path *fp; //父指针,这是以后找路劲用的,只输出步数的话它就没什么用 Path *bp; //兄弟指针,通过它连在一起的点所花费的步数都相同 int step; //表示来到这里花了多少步 string findDes; }; //读取文件进行最优路径寻找 #include "stdafx.h" #include "Path.h" #include <iostream> #include <string> #include<fstream> //用来打开文件 #include<stdlib.h> #include <vector> #include <map> #include <tchar.h> #include <sysinfoapi.h> using namespace std; static const int tv[3][4][3] = { { { 1,1,1 },{ 2,1,1 },{ 3,1,0 },{ 4,1,0 } }, { { 1,2,1 },{ 2,2,1 },{ 3,2,1 },{ 4,2,1 } }, { { 1,3,0 },{ 2,3,0 },{ 3,3,0 },{ 4,3,1 } } }; map<int,int>mpPoint; vector<string>vDes; vector<int>vPLine; vector<int>vPRow; vector<vector<Path>>ce; static int iLm, iRm; //行和列的数量 static int px=0; //x点坐标 static int py=0; //y点坐标 int iStep; //计算可以走通的路的步数 static void OpenFile() { ifstream myFile("binaaryImg.txt"); //myFile.open; int line = 0; int num = 0; if (myFile.is_open()) { char s[10000]; while (myFile.getline(s, 10000)) { px = 0; //将x坐标置为从1开始 num = 0; vector<Path> rowCe; char *p = s; while (*p!='\0') { //将值存入vectot中 if (*p=='0'||*p=='1') { int flag = atoi(p); num++; // cout << "获取值=" << flag; rowCe.push_back(Path(px, py, flag)); ++px; } ++p; } ++py; //一行完毕后,y坐标增加 line++; ce.push_back(rowCe); /*cout << s << "end" << endl; cout << "当前行数=" << line << endl; cout << "该行数据总数=" << num << endl;*/ } int a = 9; iRm = num; iLm = line; myFile.close(); } } static bool IsSuccess(int x, int y) { return(x <= (iRm-1)&&y == (iLm-1)); } bool FindPath_Copy(int sx, int sy) { Path *pBr = new Path(); //保存兄弟指针列表 int bx, by; //开始的坐标位置 int curx = 0, cury = 0; cout << "input entry point" << sx<<":"<<sy<<endl; bx = sx; by = sy; // cin >> bx >> by; Path *pCurr = &ce[by][bx]; //当前的指针 if (pCurr->flag==1) { cout << "此点不能作为入口坐标" << endl; return false; } pBr->bp = pCurr; pCurr->flag = 2; curx = bx; cury = by; while (pCurr) { if (IsSuccess(curx, cury)) { cout << "到达终点" << endl; cout << "step = " << pCurr->step << endl; cout << "Good!" << "已经找到一条路了,加油!" << endl; /* while (pCurr) {*/ cout << "终点位置:" << pCurr->px << "," << pCurr->py << endl; cout << ",方向" << pCurr->findDes << endl; int a = 8; // vPLine.insert(vPLine.begin(), (pCurr->py + 1)); // vPRow.insert(vPRow.begin(), pCurr->px + 1); // vDes.insert(vDes.begin(), pCurr->findDes); /*vPLine.push_back(pCurr->py + 1); vPRow.push_back( pCurr->px + 1); vDes.push_back( pCurr->findDes);*/ // pCurr = pCurr->fp; // } // return true; } //初始化pBr->bp;防止不满足条件时,此值不变,造成死循环 //如果此值一直为NULL,则表明该节点没有路可走 if (curx > 0 && ce[cury][curx - 1].flag == 0) //向左查找 { ce[cury][curx - 1].AddChildBroNode(pCurr, pBr,"L"); } if (curx>0&& cury < (iLm - 1) && ce[cury + 1][curx - 1].flag == 0) //左下查找 { ce[cury + 1][curx - 1].AddChildBroNode(pCurr, pBr,"LD"); } if (curx < (iRm - 1) && ce[cury][curx + 1].flag == 0) //向右查找 { ce[cury][curx + 1].AddChildBroNode(pCurr, pBr,"R"); } if (curx < (iRm - 1)&& cury < (iLm - 1) && ce[cury + 1][curx + 1].flag == 0) //右下查找 { ce[cury + 1][curx + 1].AddChildBroNode(pCurr, pBr,"RD"); } if (cury > 0 && ce[cury - 1][curx].flag == 0) //向上查找 ce[cury - 1][curx].AddChildBroNode(pCurr, pBr,"U"); if (cury > 0 && curx < (iRm - 1) && ce[cury - 1][curx + 1].flag == 0) //右上角 ce[cury - 1][curx + 1].AddChildBroNode(pCurr, pBr,"RU"); if (curx > 0 && cury > 0&& ce[cury - 1][curx - 1].flag == 0) //左上角() ce[cury - 1][curx - 1].AddChildBroNode(pCurr, pBr,"LU"); if (cury < (iLm - 1) && ce[cury + 1][curx].flag == 0) //向下查找 { ce[cury + 1][curx].AddChildBroNode(pCurr, pBr,"D"); } //遍历当前指针的所有兄弟 if (pCurr->bp) { pCurr = pCurr->bp; curx = pCurr->px; cury = pCurr->py; } else if (pBr->fp == pBr->bp) //从长兄开始,如果兄弟都没有子节点,则判定已经没有出路了 { cout << "无路可逃了,重新规划路线" << endl; break; } else if (pCurr != pBr->bp) //当前节点不是兄弟节点,则查找子节点 { pCurr = pBr->bp; curx = pCurr->px; cury = pCurr->py; pBr->fp = pCurr; } else //当前节点为叶子节点了,则退出 { cout << "无法走出迷宫,请检查数值是否正确" << endl; break; } // cout << "x" << curx << "y" << cury <<"Des"<<pCurr->findDes<<endl; } return false; } int main() { OpenFile(); int starttime = GetTickCount(); if (FindPath_Copy(32, 10)) //32,10 { /* cout << "此点可以走通" << endl; int idx = 0; for (int idx=0;idx<vPLine.size();++idx) { cout << "走过的点(行,列,查找方向):" << vPLine[idx] << "," << vPRow[idx] << "方向:" << vDes[idx] << endl; }*/ } else { cout << "此路走不通" << endl; } int endtime = GetTickCount(); int spendtime = endtime - starttime; cout << "共需时间" << spendtime << endl; return 0; }
试试其它关键字
迷宫
同语言下
.
C分鱼问题
.
链表
.
最大连续和
.
编码字符串
.
libiconv字符编码处理及判断字符串是否为utf8
.
一组数中两两二元组,差最大有几对,差最小呢?(数组
.
通过管道获取一个进程的执行状态
.
多关键字排序
.
字符串字典序排序
.
3元一次方程(牛顿迭代法求方程的根)
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
筱枚
贡献的其它代码
(
13
)
.
处理数据库中死锁的进程
.
查看表文件大小,下载文件到某个目录,显示多少行到某个
.
python
.
获取跨域的cookie实例
.
计算某个日期是星期几
.
IOS应用直接 跳转AppStore 的方法 IOS7以上
.
迷宫最短路径算法
.
模拟留言本
.
实现将PPT转换成HTML
.
开机启动项
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3