一个走迷宫的小程序(B)
B.第二版
以下是经过优化的新结果,注意红线是旧程序“过家门而不入”。新程序加了一个判断程序,走的是绿线。
1。在原有的checkGoal函数加了两个小函数
bool shortCut(Pos* pos); 判断是否在(const int SearchRange = 4;)范围内可否直达出口。
void goShortCut(Pos* pos);
用最简单的走法走到出口,即最短路经,当然是在判断成立的前提了。
bool checkGoal(Pos* pos) { bool shortCut(Pos* pos); void goShortCut(Pos* pos);
if (shortCut(pos)) //判断是否在(const int SearchRange = 4;)范围内可否直达出口。 { goShortCut(pos); //用最简单的走法走到出口,即最短路经,当然是在判断成立的前提了。 return true; } return (pos->row == End.row && pos->col == End.col); }
void goShortCut(Pos* pos) { int row, col, i=0; int rowOffSet=0, colOffSet = 0; Direction dir;
row = pos->row; col = pos->col; while (i < SearchRange) { //you have to go step by step, otherwise diagonal is illegal if (row != End.row) { rowOffSet = (pos->row > End.row ?-1: 1); //-1means up row += rowOffSet; if (rowOffSet !=0) { dir = (Direction)(rowOffSet < 0?1:3); writeRecord(dir); //这里要一步一步走,否则就变成走斜线了。 } } if (col != End.col) { colOffSet = (pos->col >End.col? -1: 1); //-1 means left col += colOffSet; if (colOffSet!=0) { dir = (Direction)(rowOffSet < 0? 2:0); writeRecord(dir); //这里要一步一步走,否则就变成走斜线了。 } } i++; } }
bool shortCut(Pos* pos) { int row, col, i=0;
if (abs(pos->row - End.row)<SearchRange&&abs(pos->col - End.col)< SearchRange) {
row = pos->row; col = pos->col; while (i<SearchRange) { if (row != End.row) { row += (pos->row > End.row ?-1: 1); if (Maze[row][col]) //这里要一步一步判断,否则就变成走斜线了。 return false; } if (col != End.col) { col += (pos->col >End.col? -1: 1); if (Maze[row][col]) //这里要一步一步判断,否则就变成走斜线了。 return false; } i++; } return true; } return false; }
以下为输入文件样子:
1 1 1 1 1 1 1 1 1 1
1 1 1 1 0 1 1 1 1 1
0 0 0 1 0 1 1 1 1 1
1 1 0 1 0 1 1 0 0 1
1 1 0 0 0 1 0 0 0 1
1 1 1 0 1 1 0 1 0 1
1 0 0 0 0 0 0 1 0 0
1 0 1 0 0 0 1 0 0 1
1 0 1 0 1 1 1 0 0 1
1 1 1 1 1 1 1 1 1 1