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;
}

原创粉丝点击