|
|
|
发新文章 |
|
|
代码参考<<java软件结构:设计和使用数据结构第二版>>,该书采用java实现,我自己用c写了一遍。
另外提醒一下:个人觉得该书翻译一般,排版较差,代码错误超多^_^,看得郁闷,不推荐。
不过总算是显示了递归的魅力,偶觉得递归实在太漂亮了^_^
/**//******************************************************************** created: 2005/12/23 created: 23:12:2005 10:47 filename: maze.h author: Liu Qi purpose: 递归走迷宫,如果有bug,请联系 ngaut#126.com *********************************************************************/
#ifndef MAZE_H #define MAZE_H
#include <stdio.h> #include <malloc.h> #include <stdbool.h> #include <assert.h>
#define COLUMN 3 #define ROW 3
#define TRIED 5 #define PASSED 6
/**//*=========================================================================== * Function name: CreateMaze * Parameter: void * Precondition: void * Description: 创建一个迷宫,该迷宫用二维数组模拟 * Return value: 指向迷宫的指针 * Author: Liu Qi, // [12/23/2005] ===========================================================================*/ int** CreateMaze( void ) { int i = 0; int j = 0;
// 设置迷宫为: // 1 1 1 // 1 0 1 // 0 1 1 // 1:(通道)运行通过,0:(墙)不许通过 int Maze[COLUMN][ROW] = { {1, 1, 1}, {1, 0, 1}, {0, 1, 1} };
//给二维数组分配空间,有点麻烦哦,我也是今天才明白, //对比之下STL的vector真好使^_^ int** pMaze = (int **) malloc (COLUMN * sizeof(int*)); assert( NULL != pMaze ); for ( i = 0; i < COLUMN; i++ ) { pMaze[i] = (int *) malloc ( ROW * sizeof(int) ); }
for ( i = 0; i < COLUMN; i++ ) { for ( j = 0; j < ROW; j++) { pMaze[i][j] = Maze[i][j]; } }
return pMaze; }
/**//*=========================================================================== * Function name: DestoryMaze * Parameter: pMaze: 指向迷宫(二维数组)的指针 * Precondition: NULL != pMaze * Description: 销毁迷宫 * Return value: void * Author: Liu Qi, // [12/23/2005] ===========================================================================*/ void DestoryMaze( int** pMaze ) { int i; assert( NULL != pMaze );
for ( i = 0; i < COLUMN; i++) { free( pMaze[i] ); }
free(pMaze); }
/**//*=========================================================================== * Function name: DisplayMaze * Parameter: Maze:二维数组 * Precondition: void * Description: 显示迷宫(二维数组) * Return value: void * Author: Liu Qi, [12/23/2005] ===========================================================================*/ void DisplayMaze(int** pMaze) { int i = 0; int j = 0;
assert( NULL != pMaze );
for ( ; i < COLUMN; i++ ) { for (j = 0; j < ROW; j++) { printf(" %d ", pMaze[i][j]); }
printf("\n"); } }
/**//*=========================================================================== * Function name: ValidPosition * Parameter: Maze:迷宫(二维数组), pos:位置 * Precondition: void * Description: 检测指定位置是否合法 * Return value: true:合法, false:不合法 * Author: Liu Qi, [12/23/2005] ===========================================================================*/ bool ValidPosition(int** pMaze, int col, int row) { bool bRet = false;
assert( NULL != pMaze );
//位置是否越界 if ((col >= 0 && col < COLUMN) && (row >= 0 && row < ROW)) { //当前位置不会是墙吧^_^, 1表示允许通过 if ( pMaze[col][row] == 1 ) { bRet = true; } }
return bRet; }
/**//*=========================================================================== * Function name: Traverse * Parameter: pMaze, col, row * Precondition: NULL != pMaze * Description: 递归的遍历迷宫的每个单元 * Return value: 如果该单元能透过则返回true,否则返回false * Author: Liu Qi, [12/23/2005] ===========================================================================*/ bool Traverse(int **pMaze, int col, int row) { bool bRet = false;
assert( NULL != pMaze );
if (ValidPosition(pMaze, col, row)) { pMaze[col][row] = TRIED;
printf("tring[%d][%d]\n", col, row);
//递归出口 if ((col == COLUMN - 1 ) && ( col == ROW - 1)) { bRet = true; } else { bRet = Traverse(pMaze, col + 1, row); //down if ( !bRet ) { bRet = Traverse(pMaze, col, row + 1); //right } if ( !bRet ) { bRet = Traverse(pMaze, col - 1, row); //up } if ( !bRet ) { bRet = Traverse(pMaze, col, row - 1); //left } }
if ( !bRet ) { pMaze[col][row] = PASSED; } }
return bRet; }
#endif
|