题目链接:https://www.lintcode.com/problem/the-maze/description
思路:广度优先搜索,BFS,
起点入队,将该点的flag标记为true,表示已访问
从该点向上滚动,到头后,假如该点是结果点,直接return true,假如该点的flag为false则表示该点未访问,入队,否则不入队,跳过
从该点向下滚动,…
左右同理,
假如BFS找到结果点了就会返回true,假如没找到,则队列到最后会变空,返回false
我的代码耗时较长,100+ms,假如有更快的方法欢迎交流
bool hasPath(vector<vector<int>> &maze, vector<int> &start, vector<int> &destination) {
// write your code here
int ii = maze.size();
int jj = maze[0].size();
vector<vector<bool>> f(ii, vector<bool>(jj, false));
int si = start[0];
int sj = start[1];
int di = destination[0];
int dj = destination[1];
queue<pair<int, int>> q;
q.push(pair<int, int>(si, sj));
while (q.size())
{
int i = q.front().first;
int j = q.front().second;
f[i][j] = true;
q.pop();
if (i == di&&j == dj)
return true;
else
{
int a = i;
int b = j;
while (true)
{
a++;
if (a == ii)
{
a--;
if (!f[a][b])
q.push(pair<int, int>(a, b));
break;
}
else if (maze[a][b]==1)
{
a--;
if (!f[a][b])
q.push(pair<int, int>(a, b));
break;
}
}
a = i, b = j;
while (true)
{
a--;
if (a <0)
{
a++;
if (!f[a][b])
q.push(pair<int, int>(a, b));
break;
}
else if (maze[a][b] == 1)
{
a++;
if (!f[a][b])
q.push(pair<int, int>(a, b));
break;
}
}
a = i, b = j;
while (true)
{
b++;
if (b==jj)
{
b--;
if (!f[a][b])
q.push(pair<int, int>(a, b));
break;
}
else if (maze[a][b] == 1)
{
b--;
if (!f[a][b])
q.push(pair<int, int>(a, b));
break;
}
}
a = i, b = j;
while (true)
{
b--;
if (b<0)
{
b++;
if (!f[a][b])
q.push(pair<int, int>(a, b));
break;
}
else if (maze[a][b] == 1)
{
b++;
if (!f[a][b])
q.push(pair<int, int>(a, b));
break;
}
}
}
}
return false;
}