📄 bothwave.cpp
字号:
// BothWave.cpp: implementation of the CBothWave class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "SearchPath.h"
#include "BothWave.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
extern map[Height][Width];
CBothWave::CBothWave()
{
for(int i=0;i<Height;i++)
{
for(int j=0;j<Width;j++)
{
m_pNode[i][j] = &m_node[i][j];
m_node[i][j].close1 = 0;
m_node[i][j].close2 = 0;
m_node[i][j].next = NULL;
m_node[i][j].value = -1;//一开始节点初始值为-1
m_node[i][j].x = j;
m_node[i][j].y = i;
if(map[i][j]==0)
{
startX=j;
startY=i;
}
else if(map[i][j]==-3)
{
targetX=j;
targetY=i;
}
}
}
}
CBothWave::~CBothWave()
{
}
int CBothWave::searchThePath()
{
head = m_pNode[startY][startX];
head->value = 0;
head->close1 = 1;
head2 = m_pNode[targetY][targetX];
head2->value = 0;
head2->close2 = 1;
while(head!=NULL && head2!=NULL)//如果一边是封闭的那么另一边也肯定不能找到路径
{
wa_node *s,*newHead = NULL,*newS,*newP;
s = head;
while(s!=NULL)
{
int i=s->y,j=s->x,ii,jj;
ii = i+1;
if((map[i+1][j]!=-1)&&(m_node[i+1][j].close1==0))//如果不在close列表中
{
if(m_node[ii][j].close2==1)
{
linkY = ii;
linkX = j;
return 1;
}
m_node[ii][j].value = m_node[i][j].value + 1;
m_node[ii][j].close1 = 1;
newS = m_pNode[ii][j];
newS->next=NULL;
if(newHead==NULL)
{
newHead = newS;
newP = newS;
}
else
{
newP->next = newS;
newP = newS;
}
}
ii = i-1;
if((map[i-1][j]!=-1)&&(m_node[i-1][j].close1==0))//如果不在close列表中
{
if(m_node[ii][j].close2==1)
{
linkY = ii;
linkX = j;
return 1;
}
m_node[ii][j].value = m_node[i][j].value + 1;
m_node[ii][j].close1 = 1;
newS = m_pNode[ii][j];
newS->next=NULL;
if(newHead==NULL)
{
newHead = newS;
newP = newS;
}
else
{
newP->next = newS;
newP = newS;
}
}
jj = j+1;
if((map[i][j+1]!=-1)&&(m_node[i][j+1].close1==0))//如果不在close列表中
{
if(m_node[i][jj].close2==1)
{
linkY = i;
linkX = jj;
return 1;
}
m_node[i][jj].value = m_node[i][j].value + 1;
m_node[i][jj].close1 = 1;
newS = m_pNode[i][jj];
newS->next=NULL;
if(newHead==NULL)
{
newHead = newS;
newP = newS;
}
else
{
newP->next = newS;
newP = newS;
}
}
jj = j-1;
if((map[i][j-1]!=-1)&&(m_node[i][j-1].close1==0))//如果不在close列表中
{
if(m_node[i][jj].close2==1)
{
linkY = i;
linkX = jj;
return 1;
}
m_node[i][jj].value = m_node[i][j].value + 1;
m_node[i][jj].close1 = 1;
newS = m_pNode[i][jj];
newS->next=NULL;
if(newHead==NULL)
{
newHead = newS;
newP = newS;
}
else
{
newP->next = newS;
newP = newS;
}
}
s = s->next;
}//向外扩展一步结束
head = newHead;
newHead = NULL;
s = head2;
while(s!=NULL)
{
int i=s->y,j=s->x,ii,jj;
ii = i+1;
if((map[i+1][j]!=-1)&&(m_node[i+1][j].close2==0))//如果不在close列表中
{
if(m_node[ii][j].close1==1)
{
linkY = ii;
linkX = j;
return 1;
}
m_node[ii][j].value = m_node[i][j].value + 1;
m_node[ii][j].close2 = 1;
newS = m_pNode[ii][j];
newS->next=NULL;
if(newHead==NULL)
{
newHead = newS;
newP = newS;
}
else
{
newP->next = newS;
newP = newS;
}
}
ii = i-1;
if((map[i-1][j]!=-1)&&(m_node[i-1][j].close2==0))//如果不在close列表中
{
if(m_node[ii][j].close1==1)
{
linkY = ii;
linkX = j;
return 1;
}
m_node[ii][j].value = m_node[i][j].value + 1;
m_node[ii][j].close2 = 1;
newS = m_pNode[ii][j];
newS->next=NULL;
if(newHead==NULL)
{
newHead = newS;
newP = newS;
}
else
{
newP->next = newS;
newP = newS;
}
}
jj = j+1;
if((map[i][j+1]!=-1)&&(m_node[i][j+1].close2==0))//如果不在close列表中
{
if(m_node[i][jj].close1==1)
{
linkY = i;
linkX = jj;
return 1;
}
m_node[i][jj].value = m_node[i][j].value + 1;
m_node[i][jj].close2 = 1;
newS = m_pNode[i][jj];
newS->next=NULL;
if(newHead==NULL)
{
newHead = newS;
newP = newS;
}
else
{
newP->next = newS;
newP = newS;
}
}
jj = j-1;
if((map[i][j-1]!=-1)&&(m_node[i][j-1].close2==0))//如果不在close列表中
{
if(m_node[i][jj].close1==1)
{
linkY = i;
linkX = jj;
return 1;
}
m_node[i][jj].value = m_node[i][j].value + 1;
m_node[i][jj].close2 = 1;
newS = m_pNode[i][jj];
newS->next=NULL;
if(newHead==NULL)
{
newHead = newS;
newP = newS;
}
else
{
newP->next = newS;
newP = newS;
}
}
s = s->next;
}//向外扩展一步结束
head2 = newHead;
}
return 0;
}
void CBothWave::prepareForStepByStep()
{
head = m_pNode[startY][startX];
head->value = 0;
head->close1 = 1;
head2 = m_pNode[targetY][targetX];
head2->value = 0;
head2->close2 = 1;
}
int CBothWave::searchThePathStepByStep()
{
if(head!=NULL && head2!=NULL)//如果一边是封闭的那么另一边也肯定不能找到路径
{
wa_node *s,*newHead = NULL,*newS,*newP;
s = head;
while(s!=NULL)
{
int i=s->y,j=s->x,ii,jj;
ii = i+1;
if((map[i+1][j]!=-1)&&(m_node[i+1][j].close1==0))//如果不在close列表中
{
if(m_node[ii][j].close2==1)
{
linkY = ii;
linkX = j;
return 1;
}
m_node[ii][j].value = m_node[i][j].value + 1;
m_node[ii][j].close1 = 1;
newS = m_pNode[ii][j];
newS->next=NULL;
if(newHead==NULL)
{
newHead = newS;
newP = newS;
}
else
{
newP->next = newS;
newP = newS;
}
}
ii = i-1;
if((map[i-1][j]!=-1)&&(m_node[i-1][j].close1==0))//如果不在close列表中
{
if(m_node[ii][j].close2==1)
{
linkY = ii;
linkX = j;
return 1;
}
m_node[ii][j].value = m_node[i][j].value + 1;
m_node[ii][j].close1 = 1;
newS = m_pNode[ii][j];
newS->next=NULL;
if(newHead==NULL)
{
newHead = newS;
newP = newS;
}
else
{
newP->next = newS;
newP = newS;
}
}
jj = j+1;
if((map[i][j+1]!=-1)&&(m_node[i][j+1].close1==0))//如果不在close列表中
{
if(m_node[i][jj].close2==1)
{
linkY = i;
linkX = jj;
return 1;
}
m_node[i][jj].value = m_node[i][j].value + 1;
m_node[i][jj].close1 = 1;
newS = m_pNode[i][jj];
newS->next=NULL;
if(newHead==NULL)
{
newHead = newS;
newP = newS;
}
else
{
newP->next = newS;
newP = newS;
}
}
jj = j-1;
if((map[i][j-1]!=-1)&&(m_node[i][j-1].close1==0))//如果不在close列表中
{
if(m_node[i][jj].close2==1)
{
linkY = i;
linkX = jj;
return 1;
}
m_node[i][jj].value = m_node[i][j].value + 1;
m_node[i][jj].close1 = 1;
newS = m_pNode[i][jj];
newS->next=NULL;
if(newHead==NULL)
{
newHead = newS;
newP = newS;
}
else
{
newP->next = newS;
newP = newS;
}
}
s = s->next;
}//向外扩展一步结束
head = newHead;
newHead = NULL;
s = head2;
while(s!=NULL)
{
int i=s->y,j=s->x,ii,jj;
ii = i+1;
if((map[i+1][j]!=-1)&&(m_node[i+1][j].close2==0))//如果不在close列表中
{
if(m_node[ii][j].close1==1)
{
linkY = ii;
linkX = j;
return 1;
}
m_node[ii][j].value = m_node[i][j].value + 1;
m_node[ii][j].close2 = 1;
newS = m_pNode[ii][j];
newS->next=NULL;
if(newHead==NULL)
{
newHead = newS;
newP = newS;
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -