1、题目类型:模拟、迷宫、DFS。
2、解题思路:(1)将输入转换为Maze[][],并记录开始位置2,结束位置3;(2)模拟,按题意要求DFS寻找最优解。
3、注意事项:注意DFS但step大于10时返回,否则程序超时;DFS中发生碰撞后,注意更新Maze[][]。
4、实现方法:
#include
<
iostream
>
#include < queue >
using namespace std;
struct Point
{
int x,y;
int step;
};
Point start,end;
int col,row,ans,flag,Maze[ 30 ][ 30 ];
int dir[ 4 ][ 2 ] = {{ - 1 , 0 },{ 0 , 1 },{ 1 , 0 },{ 0 , - 1 }};
void Init()
{
int i,j;
memset(Maze, 0 , sizeof (Maze));
ans = 11 ;
flag = 0 ;
for (i = 0 ;i < row;i ++ )
{
for (j = 0 ;j < col;j ++ )
{
cin >> Maze[i][j];
if (Maze[i][j] == 2 )
{
start.x = i;
start.y = j;
Maze[i][j] = 0 ;
}
if (Maze[i][j] == 3 )
{
end.x = i;
end.y = j;
}
}
}
}
void DFS(Point cur, int step)
{
if (step > 10 )
return ;
for ( int i = 0 ;i < 4 ;i ++ )
{
int x,y;
int j = 0 ;
x = cur.x + dir[i][ 0 ];
y = cur.y + dir[i][ 1 ];
while (x >= 0 && x < row && y >= 0 && y < col && Maze[x][y] == 0 )
{
x += dir[i][ 0 ];
y += dir[i][ 1 ];
j ++ ;
}
if (x >= 0 && x < row && y >= 0 && y < col && Maze[x][y] == 3 )
{
ans = ans > step + 1 ? step + 1 :ans;
if (ans <= 10 )
flag = 1 ;
return ;
}
if (j > 0 )
{
if (x >= 0 && x < row && y >= 0 && y < col)
{
Point p;
p.x = x - dir[i][ 0 ];
p.y = y - dir[i][ 1 ];
Maze[x][y] = 0 ;
DFS(p,step + 1 );
Maze[x][y] = 1 ;
}
}
}
}
int main()
{
while (cin >> col >> row)
{
if (col == 0 && row == 0 )
break ;
Init();
DFS(start, 0 );
if (flag)
cout << ans << endl;
else
cout << " -1 " << endl;
}
return 0 ;
}
#include < queue >
using namespace std;
struct Point
{
int x,y;
int step;
};
Point start,end;
int col,row,ans,flag,Maze[ 30 ][ 30 ];
int dir[ 4 ][ 2 ] = {{ - 1 , 0 },{ 0 , 1 },{ 1 , 0 },{ 0 , - 1 }};
void Init()
{
int i,j;
memset(Maze, 0 , sizeof (Maze));
ans = 11 ;
flag = 0 ;
for (i = 0 ;i < row;i ++ )
{
for (j = 0 ;j < col;j ++ )
{
cin >> Maze[i][j];
if (Maze[i][j] == 2 )
{
start.x = i;
start.y = j;
Maze[i][j] = 0 ;
}
if (Maze[i][j] == 3 )
{
end.x = i;
end.y = j;
}
}
}
}
void DFS(Point cur, int step)
{
if (step > 10 )
return ;
for ( int i = 0 ;i < 4 ;i ++ )
{
int x,y;
int j = 0 ;
x = cur.x + dir[i][ 0 ];
y = cur.y + dir[i][ 1 ];
while (x >= 0 && x < row && y >= 0 && y < col && Maze[x][y] == 0 )
{
x += dir[i][ 0 ];
y += dir[i][ 1 ];
j ++ ;
}
if (x >= 0 && x < row && y >= 0 && y < col && Maze[x][y] == 3 )
{
ans = ans > step + 1 ? step + 1 :ans;
if (ans <= 10 )
flag = 1 ;
return ;
}
if (j > 0 )
{
if (x >= 0 && x < row && y >= 0 && y < col)
{
Point p;
p.x = x - dir[i][ 0 ];
p.y = y - dir[i][ 1 ];
Maze[x][y] = 0 ;
DFS(p,step + 1 );
Maze[x][y] = 1 ;
}
}
}
}
int main()
{
while (cin >> col >> row)
{
if (col == 0 && row == 0 )
break ;
Init();
DFS(start, 0 );
if (flag)
cout << ans << endl;
else
cout << " -1 " << endl;
}
return 0 ;
}