c++实现的Dijkstra算法
来源:互联网 发布:下载了wpsoffice软件 编辑:程序博客网 时间:2024/05/22 20:42
// run.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <queue>
#include <array>
#define MAX_PATH 50
struct point
{
int ptX;
int ptY;
void operator=(point p)
{
ptX = p.ptX;
ptY = p.ptY;
}
bool operator==(point p)
{
return ((ptX==p.ptX)&&(ptY==p.ptY))? true : false;
}
};
struct path
{
point ptSrc;
point ptDst;
point ptMid[MAX_PATH];
int length;
bool flag;
path()
{
for (int i=0;i<MAX_PATH;i++)
{
ptMid[i].ptX=-1;
ptMid[i].ptY=-1;
}
flag = 0;
length = -1;
}
void operator=(path p)
{
ptSrc = p.ptSrc;
ptDst = p.ptDst;
flag = p.flag;
memcpy(ptMid,p.ptMid,sizeof(ptMid));
length = p.length;
}
bool operator<(path p)
{
if (length<p.length)
{
return true;
}
return false;
}
bool operator==(path p)
{
if (ptDst==p.ptDst)
{
return true;
}
return false;
}
};
std::array<path,MAX_PATH> lstPath;
bool AddToArray(point ptNext,path ptMin)
{
if (!(ptNext == ptMin.ptSrc))
{
bool flag = false;
for (int j=0;j<MAX_PATH;j++)
{
if (!(ptNext == ptMin.ptMid[j]))
{
bool flag = true;;
}
}
if (flag)
{
return false;
}
else
{
for (int m=0;m<(int)lstPath.size();m++)
{
if (lstPath[m].ptDst==ptNext)
{
flag = true;
if (lstPath[m].length<ptMin.length)
{
return false;
}
lstPath[m] = ptMin;
int n = 0;
for (;n<MAX_PATH;n++)
{
if ((lstPath[m].ptMid[n].ptX==-1)&&(lstPath[m].ptMid[n].ptY==-1))
{
break;
}
}
lstPath[m].ptMid[n] = lstPath[m].ptDst;
lstPath[m].ptDst = ptNext;
lstPath[m].length += 1;
return false;
}
}
if (!flag)
{
for (int m=0;m<(int)lstPath.size();m++)
{
if (lstPath[m].length==-1)
{
lstPath[m] = ptMin;
int n = 0;
for (;n<MAX_PATH;n++)
{
if ((lstPath[m].ptMid[n].ptX==-1)&&(lstPath[m].ptMid[n].ptY==-1))
{
break;
}
}
lstPath[m].ptMid[n] = lstPath[m].ptDst;
lstPath[m].ptDst = ptNext;
lstPath[m].length += 1;
return true;
}
}
}
}
}
return false;
}
void Dijkstra(int *map,int num, point src,point dst)
{
path pthhead;
pthhead.ptSrc = src;
pthhead.ptDst = src;
pthhead.length = 0;
lstPath[0]=pthhead;
int count = 1;
while (count<num)
{
//取flag=0的最小的path
path ptMin;
int i=0;
if (count == 6)
{
i=0;
}
for (;i<count;i++)
{
if (lstPath[i].flag == 0)
{
ptMin = lstPath[i];
break;
}
}
if (i >= count)
{
return;
}
i = 0;
for (;i<count;i++)
{
if (lstPath[i].flag == 0)
{
if (lstPath[i]<ptMin)
{
ptMin = lstPath[i];
}
}
}
//设置flag值为1
for (i=0;i<count;i++)
{
if (lstPath[i]==ptMin)
{
lstPath[i].flag = 1;
}
}
//搜寻下一个节点
if ((ptMin.ptDst.ptX==1)&&(ptMin.ptDst.ptY==4))
{
ptMin.flag = 0;
}
point ptNext = ptMin.ptDst;
ptNext.ptX -= 1;
if (ptNext.ptX>=0)
{
if (map[ptNext.ptX*6+ptNext.ptY]==1)
{
ptMin.flag = false;
if(AddToArray(ptNext,ptMin))
{
count++;
}
}
else
{
ptMin.flag = true;
if(AddToArray(ptNext,ptMin))
{
count++;
}
}
}
ptNext = ptMin.ptDst;
ptNext.ptX += 1;
if (ptNext.ptX<6)
{
if (map[ptNext.ptX*6+ptNext.ptY]==1)
{
ptMin.flag = false;
if(AddToArray(ptNext,ptMin))
{
count++;
}
}
else
{
ptMin.flag = true;
if(AddToArray(ptNext,ptMin))
{
count++;
}
}
}
ptNext = ptMin.ptDst;
ptNext.ptY -= 1;
if (ptNext.ptY>=0)
{
if (map[ptNext.ptX*6+ptNext.ptY]==1)
{
ptMin.flag = false;
if(AddToArray(ptNext,ptMin))
{
count++;
}
}
else
{
ptMin.flag = true;
if(AddToArray(ptNext,ptMin))
{
count++;
}
}
}
ptNext = ptMin.ptDst;
ptNext.ptY += 1;
if (ptNext.ptY<6)
{
if (map[ptNext.ptX*6+ptNext.ptY]==1)
{
ptMin.flag = false;
if(AddToArray(ptNext,ptMin))
{
count++;
}
}
else
{
ptMin.flag = true;
if(AddToArray(ptNext,ptMin))
{
count++;
}
}
}
}
return;
}
int _tmain(int argc, _TCHAR* argv[])
{
int map[6][6]=
{
1,1,1,0,1,1,
1,1,1,1,1,1,
1,0,0,0,0,1,
1,0,1,1,1,0,
1,1,1,0,1,1,
1,1,1,1,0,1
};
point src,dst;
src.ptX = 0;
src.ptY =5;
dst.ptX = 5;
dst.ptY = 5;
Dijkstra((int*)map,36,src,dst);
int i=0;
point pt;
for (;i<(int)lstPath.size();i++)
{
if (lstPath[i].ptDst==dst)
{
for (int m=0;m<6;m++)
{
for (int n=0;n<6;n++)
{
pt.ptX = m;
pt.ptY = n;
if ((lstPath[i].ptSrc==pt)||(lstPath[i].ptDst==pt))
{
printf("_");
printf(" ");
continue;
}
int p = 0;
for (;p<MAX_PATH;p++)
{
if (lstPath[i].ptMid[p]==pt)
{
printf("_");
printf(" ");
break;
}
}
if (p == MAX_PATH)
{
printf("%d",map[m][n]);
printf(" ");
continue;
}
}
printf("\n");
}
}
}
printf("\n");
int a = (2<<16)+2;
std::queue<int> ls;
ls.push(1);
ls.push(2);
printf("%d\n",ls.front());
ls.pop();
printf("%d\n",ls.front());
ls.pop();
printf("%d,%d ",a&0x0000ffff,(a&0xffff0000)>>16);
return 0;
}
//
#include "stdafx.h"
#include <queue>
#include <array>
#define MAX_PATH 50
struct point
{
int ptX;
int ptY;
void operator=(point p)
{
ptX = p.ptX;
ptY = p.ptY;
}
bool operator==(point p)
{
return ((ptX==p.ptX)&&(ptY==p.ptY))? true : false;
}
};
struct path
{
point ptSrc;
point ptDst;
point ptMid[MAX_PATH];
int length;
bool flag;
path()
{
for (int i=0;i<MAX_PATH;i++)
{
ptMid[i].ptX=-1;
ptMid[i].ptY=-1;
}
flag = 0;
length = -1;
}
void operator=(path p)
{
ptSrc = p.ptSrc;
ptDst = p.ptDst;
flag = p.flag;
memcpy(ptMid,p.ptMid,sizeof(ptMid));
length = p.length;
}
bool operator<(path p)
{
if (length<p.length)
{
return true;
}
return false;
}
bool operator==(path p)
{
if (ptDst==p.ptDst)
{
return true;
}
return false;
}
};
std::array<path,MAX_PATH> lstPath;
bool AddToArray(point ptNext,path ptMin)
{
if (!(ptNext == ptMin.ptSrc))
{
bool flag = false;
for (int j=0;j<MAX_PATH;j++)
{
if (!(ptNext == ptMin.ptMid[j]))
{
bool flag = true;;
}
}
if (flag)
{
return false;
}
else
{
for (int m=0;m<(int)lstPath.size();m++)
{
if (lstPath[m].ptDst==ptNext)
{
flag = true;
if (lstPath[m].length<ptMin.length)
{
return false;
}
lstPath[m] = ptMin;
int n = 0;
for (;n<MAX_PATH;n++)
{
if ((lstPath[m].ptMid[n].ptX==-1)&&(lstPath[m].ptMid[n].ptY==-1))
{
break;
}
}
lstPath[m].ptMid[n] = lstPath[m].ptDst;
lstPath[m].ptDst = ptNext;
lstPath[m].length += 1;
return false;
}
}
if (!flag)
{
for (int m=0;m<(int)lstPath.size();m++)
{
if (lstPath[m].length==-1)
{
lstPath[m] = ptMin;
int n = 0;
for (;n<MAX_PATH;n++)
{
if ((lstPath[m].ptMid[n].ptX==-1)&&(lstPath[m].ptMid[n].ptY==-1))
{
break;
}
}
lstPath[m].ptMid[n] = lstPath[m].ptDst;
lstPath[m].ptDst = ptNext;
lstPath[m].length += 1;
return true;
}
}
}
}
}
return false;
}
void Dijkstra(int *map,int num, point src,point dst)
{
path pthhead;
pthhead.ptSrc = src;
pthhead.ptDst = src;
pthhead.length = 0;
lstPath[0]=pthhead;
int count = 1;
while (count<num)
{
//取flag=0的最小的path
path ptMin;
int i=0;
if (count == 6)
{
i=0;
}
for (;i<count;i++)
{
if (lstPath[i].flag == 0)
{
ptMin = lstPath[i];
break;
}
}
if (i >= count)
{
return;
}
i = 0;
for (;i<count;i++)
{
if (lstPath[i].flag == 0)
{
if (lstPath[i]<ptMin)
{
ptMin = lstPath[i];
}
}
}
//设置flag值为1
for (i=0;i<count;i++)
{
if (lstPath[i]==ptMin)
{
lstPath[i].flag = 1;
}
}
//搜寻下一个节点
if ((ptMin.ptDst.ptX==1)&&(ptMin.ptDst.ptY==4))
{
ptMin.flag = 0;
}
point ptNext = ptMin.ptDst;
ptNext.ptX -= 1;
if (ptNext.ptX>=0)
{
if (map[ptNext.ptX*6+ptNext.ptY]==1)
{
ptMin.flag = false;
if(AddToArray(ptNext,ptMin))
{
count++;
}
}
else
{
ptMin.flag = true;
if(AddToArray(ptNext,ptMin))
{
count++;
}
}
}
ptNext = ptMin.ptDst;
ptNext.ptX += 1;
if (ptNext.ptX<6)
{
if (map[ptNext.ptX*6+ptNext.ptY]==1)
{
ptMin.flag = false;
if(AddToArray(ptNext,ptMin))
{
count++;
}
}
else
{
ptMin.flag = true;
if(AddToArray(ptNext,ptMin))
{
count++;
}
}
}
ptNext = ptMin.ptDst;
ptNext.ptY -= 1;
if (ptNext.ptY>=0)
{
if (map[ptNext.ptX*6+ptNext.ptY]==1)
{
ptMin.flag = false;
if(AddToArray(ptNext,ptMin))
{
count++;
}
}
else
{
ptMin.flag = true;
if(AddToArray(ptNext,ptMin))
{
count++;
}
}
}
ptNext = ptMin.ptDst;
ptNext.ptY += 1;
if (ptNext.ptY<6)
{
if (map[ptNext.ptX*6+ptNext.ptY]==1)
{
ptMin.flag = false;
if(AddToArray(ptNext,ptMin))
{
count++;
}
}
else
{
ptMin.flag = true;
if(AddToArray(ptNext,ptMin))
{
count++;
}
}
}
}
return;
}
int _tmain(int argc, _TCHAR* argv[])
{
int map[6][6]=
{
1,1,1,0,1,1,
1,1,1,1,1,1,
1,0,0,0,0,1,
1,0,1,1,1,0,
1,1,1,0,1,1,
1,1,1,1,0,1
};
point src,dst;
src.ptX = 0;
src.ptY =5;
dst.ptX = 5;
dst.ptY = 5;
Dijkstra((int*)map,36,src,dst);
int i=0;
point pt;
for (;i<(int)lstPath.size();i++)
{
if (lstPath[i].ptDst==dst)
{
for (int m=0;m<6;m++)
{
for (int n=0;n<6;n++)
{
pt.ptX = m;
pt.ptY = n;
if ((lstPath[i].ptSrc==pt)||(lstPath[i].ptDst==pt))
{
printf("_");
printf(" ");
continue;
}
int p = 0;
for (;p<MAX_PATH;p++)
{
if (lstPath[i].ptMid[p]==pt)
{
printf("_");
printf(" ");
break;
}
}
if (p == MAX_PATH)
{
printf("%d",map[m][n]);
printf(" ");
continue;
}
}
printf("\n");
}
}
}
printf("\n");
int a = (2<<16)+2;
std::queue<int> ls;
ls.push(1);
ls.push(2);
printf("%d\n",ls.front());
ls.pop();
printf("%d\n",ls.front());
ls.pop();
printf("%d,%d ",a&0x0000ffff,(a&0xffff0000)>>16);
return 0;
}
- C++Dijkstra算法实现
- Dijkstra 算法的 C/C++ 实现
- Dijkstra算法的简单实现(C++)
- Dijkstra算法 c语言实现
- Dijkstra算法 c/c++实现
- dijkstra算法C语言实现
- c/c++ Dijkstra算法实现
- Dijkstra算法的实现
- Dijkstra算法的实现
- dijkstra算法的实现。
- Dijkstra算法的实现
- 数据结构(C#)--Dijkstra 算法的最小路径的实现
- 配合Dijkstra算法的Hash表实现文件C语言
- 配合Dijkstra算法的二叉堆实现文件C语言
- Dijkstra 算法+Heap堆的完整c实现源码
- 最短路径之dijkstra算法的C语言实现
- 最短路径Dijkstra算法的C语言实现
- C语言实现图的最短路径Dijkstra算法
- 深圳的坪州已经快赶上科技园那么繁华了
- Calendar---android 中系统日期时间的获取
- 11g中物理dg的改进
- iframe 获取父窗体
- 开发工具(SVN/Eclipse/EditPlus/UltraEdit)
- c++实现的Dijkstra算法
- DatePicker TimePicker---日期时间控件
- SGU 253 判断点在凸包内
- KMP字符串模式匹配详解
- 调试过程所遇问题汇集
- Apache Struts2高危漏洞 ,站长们行动起来吧!
- autotools工具使用
- Thinking in Java [Java编程机制] 学习笔记 -- List / ArrayList
- linux下 nm 命令