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

 

 

                                                                     back.gif (341 bytes)      up.gif (335 bytes)       next.gif (337 bytes)