⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bothwave.cpp

📁 用 vc 编 写 的
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -