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