学习心得:数据结构与算法之回朔(一个“框架”)

原创 2007年09月15日 18:34:00
一、回溯算法简单说就是“一直向前走,碰壁就会头”。一个经典的例子是走迷宫,一直向前走,碰壁就回头。下面就看看这个“框架”(vc6.0下编译):
/**//////////////////////////
// Application.h

#ifndef APPLICATION_H
#define APPLICATION_H

#include 
"iostream.h"
#include 
"Position.h"

class Application
...{
protected:
    friend ostream
& operator << (ostream& stream, Application& app);

public:
    Position generateInitialState();
    
bool valid (const Position &pos);
    
bool done (const Position &pos);
    
void record (const Position &pos);
    
void undo (const Position &pos);

    
class Iterator
    
...{
    
protected:
        
void* fieldPtr;

    
public:
        Iterator ();
        Iterator (
const Position& pos);
        Position 
operator ++ (int);
        
bool atEnd (); 
    }
;
}
;


#endif 
/**////////////////////////////////////////
//  BACKTRACK_H
#ifndef BACKTRACK_H
#define BACKTRACK_H

#include 
"Application.h"
#include 
"Position.h"

class BackTrack
...{
public:
    BackTrack (Application 
&app);
    
bool tryToSolve (Position& pos);
protected:
    Application app;
}
;
    
#endif

 

/**///////////////////////
//BrackTrack.cpp
#include "BackTrack.h"

BackTrack::BackTrack (Application 
&app)
...{
    
this->app = app;
}


bool BackTrack::tryToSolve (Position &pos)
...{
    
bool success = false;

    Application::Iterator itr(pos);
    
while (!success && !itr.atEnd())
    
...{
        pos 
= itr++;
        
if (app.valid(pos))
        
...{
            app.record(pos);
            
if (app.done(pos))
                success 
= true;
            
else
            
...{
                success 
= tryToSolve(pos);
                
if (!success)
                    app.undo(pos);
            }

        }

    }

    
return success;
}

 

/**//////////////////////////////
//main,cpp
#include "iostream.h"
#include 
"string.h"
#include 
"BackTrack.h"
#include 
"Application.h"
#include 
"Position.h"

int main()
...{
    Application app;
    BackTrack b(app);

    Position pStart 
= app.generateInitialState();
    
//cout<<app;
    
    
if (!app.valid(pStart))
        cout 
<< "there is no solution:" << endl;
    
else
    
...{
        app.record (pStart);
        
if (app.done (pStart) || b.tryToSolve(pStart))
            cout 
<< "success" << endl;
        
else
        
...{
            app.undo(pStart);
            cout 
<< "there is no solution" << endl;
        }

    }

    
return 0;
}

 

二、下面就以迷宫为例子用这个“框架”

 

/**//////////////////////////////////////////
// POSITION_H

#ifndef POSITION_H
#define POSITION_H

class Position
...{
protected:
    
int nRow;
    
int nColumn;

public:
    Position();
    Position(
int nRow, int nColumn);
    
void SetPosition(int nRow, int nColumn);
    
int GetRow() const;
    
int GetColumn() const;
}
;

#endif
/**///////////////////////////////////
//  Position.cpp
#include "Position.h"

Position::Position()
...{
    nRow 
= 0;
    nColumn 
= 0;
}


Position::Position(
int nRow, int nColumn)
...{
    
this->nRow = nRow;
    
this->nColumn = nColumn;
}


void Position::SetPosition(int nRow, int nColumn)
...{
    
this->nRow = nRow;
    
this->nColumn = nColumn;
}


int Position::GetRow() const
...{
    
return nRow;
}


int Position::GetColumn() const
...{
    
return nColumn;
}
/**////////////////////////////////////
//Application.cpp

#include 
"iostream.h"
#include 
"Application.h"
#include 
"Position.h"

const short WALL = 0;
const short CORRIDOR = 1;
const short PATH = 9;
const short TRIED = 2;
const short ROWS = 8;
const short COLUMNS = 13;

short grid[ROWS][COLUMNS] = 
...{
    
...{1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1},
    
...{1 , 0 , 1 , 1 , 1 , 0 , 1 , 1 , 1 , 1 , 1 , 0 , 1},
    
...{1 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 1 , 0 , 1 , 0 , 1},
    
...{1 , 0 , 1 , 0 , 0 , 1 , 1 , 0 , 1 , 0 , 1 , 1 , 1},
    
...{1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1},
    
...{1 , 0 , 1 , 0 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 1},
    
...{1 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 1},
    
...{1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1},
}
;

Position posStart;
Position posFinish;



Position Application::generateInitialState()
...{
    
int nRow;
    
int nColumn;

    cout 
<< "Please enter the start row and start column:";
    cin 
>> nRow >> nColumn;
    posStart.SetPosition(nRow, nColumn);
    cout 
<< endl;
    cout 
<< "Please enter the finish row and finish column:";
    cin 
>> nRow >> nColumn;
    cout 
<< endl;
    posFinish.SetPosition (nRow, nColumn);
    
return posStart;
}


bool Application::valid(const Position& pos) 
...{
    
if (pos.GetRow() >= 0 && pos.GetRow() < ROWS &&
        pos.GetColumn() 
>= 0 && pos.GetColumn() < COLUMNS &&
        grid[pos.GetRow()][pos.GetColumn()] 
== CORRIDOR)
    
...{
        
return true;
    }

    
return false;
}


void Application::record(const Position &pos)
...{
    grid[pos.GetRow()][pos.GetColumn()] 
= PATH;   //标识该点为已经在路径中
}


bool Application::done(const Position &pos)
...{
    
return posFinish.GetRow() == pos.GetRow() &&
        posFinish.GetColumn() 
== pos.GetColumn();
}


void Application::undo(const Position &pos)
...{
    grid[pos.GetRow()][pos.GetColumn()] 
= TRIED;  //此路不通
}


ostream
& operator << (ostream& stream, Application* app)
...{
    
for (int nRow = 0 ; nRow < ROWS ; nRow++)
    
...{
        
for (int nColumn = 0 ; nColumn < COLUMNS ; nColumn)
            cout 
<< grid[nRow][nColumn] << " ";
        cout 
<< endl;
    }

    
return stream;
}



// Iterztor
typedef struct _tagItrFields
...{
    
int nRow;
    
int nColumn;
    
int nDirection;
}
ITRFIELDS, *LPITRFIELDS;

Application::Iterator::Iterator(
const Position &pos)
...{
    LPITRFIELDS itrPtr 
= new ITRFIELDS;
    itrPtr
->nColumn = pos.GetColumn();
    itrPtr
->nRow = pos.GetRow();
    itrPtr
->nDirection = 0;
    fieldPtr 
= itrPtr;
}


Position Application::Iterator::
operator ++ (int)
...{
    LPITRFIELDS itrPtr 
= (LPITRFIELDS)fieldPtr;
    
int nRow = itrPtr->nRow;
    
int nColumn = itrPtr->nColumn;

    
switch(itrPtr->nDirection++)
    
...{
    
case '0':
        nRow
--;
        
break;
    
case '1':
        nColumn
++;
        
break;
    
case '2':
        nRow
++;
        
break;
    
case '3':
        nColumn
--;
        
break;
    
default:
        
break;
    }

    Position next(nRow, nColumn);
    
return next;
}


bool Application::Iterator::atEnd()
...{
    
return ((LPITRFIELDS)fieldPtr)->nDirection >= 3;
}

数据结构与算法学习心得

数据结构与算法的内容还有很多。但是由于时间的关系,我并没有深入下去,尤其是查找时用到的平衡二叉树、B_和B+树,还有红黑树等等。希望以后有时间可以继续看。 首先,简要回顾一下学习的内容。简单的说,是...
  • thefutureisour
  • thefutureisour
  • 2012年09月04日 09:08
  • 8704

常用算法-回朔法

1、概念回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但...
  • yixianfeng41
  • yixianfeng41
  • 2017年02月18日 23:46
  • 401

算法——回朔法简介

回溯法简介及示例        回溯法是递归算法的一种特殊形式,回溯法的基本思想是:对一个包括很多结点,每个结点有若干个搜索分支的问题,把原问题分解为对若干个子问题求解的算法。当搜索到某个结点、发现...
  • Never_Blue
  • Never_Blue
  • 2017年05月12日 11:31
  • 380

数据结构之链表学习心得

顺序表从节点之间的链接方式分我连续空间顺序表和链式顺序表,前者的实现就是在普通数组上做了封装,后者实现就是前一个节点保存后一个节点的地址。本文讨论的就是后者,链式顺序表的一个最明显的特征,就是在增减,...
  • liubo2011
  • liubo2011
  • 2016年05月01日 10:02
  • 629

回朔算法简单实例

回朔遍历下如:  解题代码如下: import java.util.ArrayList; import java.util.List; public class Test { ...
  • ihrthk
  • ihrthk
  • 2012年03月10日 19:32
  • 954

数据结构与算法分析c++版本学习总结

主要记录了数据结构的学习心得和总结,方便以后参阅 第一章 引论 该部分主要介绍了一些基本概念和数学基础 1、递归 当一个函数用自身来定义时就称为递归(recursive)。 递归...
  • qq_27450255
  • qq_27450255
  • 2017年11月07日 14:52
  • 91

关于回朔算法

回朔法是计算机程序设计中通用的算法随着计算机性能越来 越好,穷举已经成为了解决问题的一个有效地途径。在穷举途径中采用回朔的方法,关键是要设计好剪枝方法。通用的回朔法的程序模板如下(《挑战编程》)#in...
  • duxingstar
  • duxingstar
  • 2010年11月30日 16:36
  • 1965

回朔算法

在程序设计中,有这样一类问题:求一类解,或求全部解,或求最优解的问题(例如八皇后问题),不是根据某种确定的算法设计法则,而是利用试探和回朔的搜索技术求解. 回朔还是设计递归算法的重要方法,其求解...
  • coincidenceWQ
  • coincidenceWQ
  • 2013年11月19日 21:45
  • 796

回朔算法-------------八皇后

八皇后问题 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都...
  • zhangyang199808
  • zhangyang199808
  • 2017年12月30日 22:00
  • 28

数据结构与算法之八大排序

排序是编程的基础,在程序中会经常使用,好的排序方法可以帮助你提高程序运行的效率,所以学好排序,打好基础,对于程序的优化会手到擒来。无论你的技术多么强,如果没有基础也强不到哪去。        不...
  • jia_xu_
  • jia_xu_
  • 2017年10月06日 17:14
  • 167
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:学习心得:数据结构与算法之回朔(一个“框架”)
举报原因:
原因补充:

(最多只允许输入30个字)