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

📄 findpath.cpp

📁 一个实用的路径搜索图象处理程序源代码.对某些从事人工智能的算法应用有参考价值.
💻 CPP
字号:
// FindPath.cpp: implementation of the CFindPath class.
//
//////////////////////////////////////////////////////////////////////


#include "stdafx.h"
#include "FindAllPath.h"
#include "FindPath.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
ClayData::ClayData()
{
 m_num_data = 0 ;
}
ClayData::~ClayData()
{
if ( m_data != NULL)
delete []m_data ;

if( m_pre != NULL)
delete []m_pre;

}

CFindPath::CFindPath()
{
	m_list = NULL;

}

CFindPath::~CFindPath()
{ 

  //delete []m_list;
  

}

ClayData::ClayData(int lengthpre, int numdata)
{
	m_num_data = numdata ;
   m_data = new int[numdata + 1];
   m_pre = new int [lengthpre + 1];}

BOOL CFindPath::FindPath()
{
  BOOL breturn = FALSE;
  CPathList m_pathList;
  m_list = new CLayList[NUM];
 if (!DealFisrtLay())
	 return FALSE;
  for ( int i = 2 ; i < NUM ; i++)
  {
	  DealLayData(i);
  }

 for ( int j = 1 ; j < NUM ; j++)
 {
	 int k = 0 ;
     k = m_list[j].GetSize();
	 for ( int f = 0 ; f <  k ; f++)
	 {
         ClayData * laydata = m_list[j].GetAt(f);
		 TRACE("%d",laydata->m_num_data);
		 for ( int g = 1 ; g <= laydata->m_num_data ; g++)
		 {
			 if ( laydata->m_data[g] == to)
			 {
				 CPathData * _pathdata = new CPathData(j+1);

				 for ( int l = 1 ; l <= j ; l++)
				 {   
					 _pathdata->data[l-1] = laydata->m_pre[l];
				 }
				 _pathdata->data[j] = to;
                 m_pathList.Add(_pathdata);
			 }
		 }
	 }

 }

  printf("从顶点%d到顶点%d的所有路径如下:\n",from,to);
 for ( int f = 0 ; f < m_pathList.GetSize(); f++)
 {
    CPathData * _pathData = m_pathList.GetAt(f);
	for ( int l = 0 ; l <  _pathData->PathLength  ; l++)
	{
		printf("%d\t",_pathData->data[l]);
	}
	printf("\n");
	
 }

   ClearList();
 
  return breturn;

}


BOOL CFindPath::DealFisrtLay()
{
	BOOL breturn = FALSE;
    int num = NUM;

	if (num <= 1 )
		breturn = FALSE;
	int length = 0  ;
	int *_data = new int[num+1];

	for ( int j = 1 ; j <= num ; j++)
	{
		if(m_adj(from,j) == 1 )
		{
			length++;
			_data[length] = j ;
		}
	}

	ClayData * _laydata = new ClayData(1,length);
	_laydata->m_pre[1] = from ;

	while(length)
	{
		_laydata->m_data[length] = _data[length];
		length--;
		breturn = TRUE;

	}
	m_list[1].Add(_laydata);

	delete _data; // maybe some error in this line;


  return breturn;

}

BOOL CFindPath::DealLayData(int laynum)
{

 BOOL breturn = FALSE;

 int lastlay = laynum - 1;
 int * _datatemp = new int[NUM];
 int length  = 0;
 for ( int i = 0 ; i < m_list[lastlay].GetSize() ; i++)
 {
	 ClayData * lastlaydata = m_list[lastlay].GetAt(i);
     for ( int j = 1 ; j <= lastlaydata->m_num_data ; j++)
	 {
		 int laythisdata = lastlaydata->m_data[j];
		 length = 0 ;

		 if ( laythisdata != to) //if equ to , don't dealwith
		 {
			 for ( int k = 1 ; k <= NUM ; k++)
			 {
				 if(m_adj(laythisdata,k) == 1 && NotInPreData(k,lastlaydata->m_pre,lastlay)) // if not in data , should add a new laydata
				 {
                       length++;
					   _datatemp[length] = k;
                     
				 }
			 }

			 ClayData * newlaydata = new ClayData ( laynum,length); //should add a new laydata
             int f ; 
             for (  f = 1 ; f <= lastlay ; f++)
			 {
				 newlaydata->m_pre[f] = lastlaydata->m_pre[f];

			 }

			 newlaydata->m_pre[f] = laythisdata ;  // add a new laydata , because of a new lay;

			 for ( f = 1 ;  f <= length ; f++)
			 {
				 newlaydata->m_data[f] = _datatemp[f];
			 }
                 
			 breturn = TRUE;

			 m_list[laynum].Add(newlaydata);
		 }
	 }

 }
delete []_datatemp;

  return breturn;
}

BOOL CFindPath::NotInPreData(int k, int *data, int length)
{
 
	BOOL breturn = TRUE;
 
	for ( int i = 1 ; i <= length ; i++)
	{
		if ( k == data[i] )
		{
			breturn = FALSE;
			break;
		}
	}

  return breturn;
}

void CFindPath::ClearList()
{
 for ( int j = 1 ; j < NUM ; j++)
 {
	 int k = 0 ;
     k = m_list[j].GetSize();
	 for ( int f = 0 ; f <  k ; f++)
	 {
         delete m_list[j].GetAt(f);
		 
	 }
	 m_list[j].RemoveAll();

 }
 delete []m_list;



}

CPathData::CPathData(int length)
{
 PathLength = length;
 data = new int[length];

}

CPathData::~CPathData()
{
 delete [] data;

}

CPathData::CPathData()
{

}

CFindPath::CFindPath(int num)
{
  NUM = num ;
  m_adj.ReSetRowCol(NUM,NUM);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -