一个走迷宫的小程序(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