昨天面试Momenta的一个面试题。只给5-10分钟的时间,不需要写代码,只说出解题的思路,当时可能时间太紧加紧张没完全说出来,今天写一下代码,对自己有个交代
#include<iostream>
#include<vector>
#include<queue>
/*有一个离散的二维平面中有m x n的网格,网格上面可能有障碍物也可能没有,
写一个方程式来表示从某一个非终点位置出发每次只能走一步,可以走到上、下、左、右、左上、左下、右上、右下共8个方向,是否能够到达终点(BFS或者DFS都可以)
*/
class mom
{
public:
//0表示当前位置无障碍物,1表示有障碍物.从某一个无障碍物的点是否可以到达最后
bool canReach_dfs(std::vector<std::vector<int>>gird)
{
int m=gird.size();
int n=gird[0].size();
if(gird[m-1][n-1]==1)
{
std::cout<<"false"<<std::endl;
return false;
}
for(int i=0;i<m-1;++i)
{
for(int j=0;j<n-1;++j)
{
if(gird[i][j]==0)
{
dfs(gird,i,j);
}
}
}
if(gird[m-1][n-1]==1)
{
return true;
}
return false;
}
void dfs(std::vector<std::vector<int>>&gird,int i,int j)
{
int m=gird.size();
int n=gird[0].size();
gird[i][j]=1;
if(j>0&&gird[i][j-1]==0){dfs(gird,i,j-1);}
if(j<n-1&&gird[i][j+1]==0){dfs(gird,i,j+1);}
if(i>0&&gird[i-1][j]==0){dfs(gird,i-1,j);}
if(i<m-1&&gird[i+1][j]==0){dfs(gird,i+1,j);}
if(i>0&&j>0&&gird[i-1][j-1]==0){dfs(gird,i-1,j-1);}
if(i>0&&j<n-1&&gird[i-1][j+1]==0){dfs(gird,i-1,j+1);}
if(i<m-1&&j>0&&gird[i+1][j-1]==0){dfs(gird,i+1,j-1);}
if(i<m-1&&j<n-1&&gird[i+1][j+1]==0){dfs(gird,i+1,j+1);}
}
bool canReach_bfs(std::vector<std::vector<int>>gird)
{
std::queue<std::pair<int,int>>qu;
int m=gird.size();
int n=gird[0].size();
if(gird[m-1][n-1]==1)
{
std::cout<<"false"<<std::endl;
return false;
}
for(int i=0;i<m-1;++i)
{
for(int j=0;j<n-1;++j)
{
if(gird[i][j]==0)
{
qu.push({i,j});
gird[i][j]=1;
while(!qu.empty())
{
int x=qu.front().first;
int y=qu.front().second;
qu.pop();
if(x>0&&gird[x-1][y]==0)
{
qu.push({x-1,y});
gird[x-1][y]=1;
}
if(x<m-1&&gird[x+1][y]==0)
{
qu.push({x-1,y});
gird[x+1][y]=1;
}
if(y>0&&gird[x][y-1]==0)
{
qu.push({x,y-1});
gird[x][y-1]=1;
}
if(y<m-1&&gird[x][y+1]==0)
{
qu.push({x,y+1});
gird[x][y+1]=1;
}
if(x>0&&y>0&&gird[x-1][y-1]==0)
{
qu.push({x-1,y-1});
gird[x-1][y-1]=1;
}
if(x>0&&y<m-1&&gird[x-1][y+1]==0)
{
qu.push({x-1,y+1});
gird[x-1][y+1]=1;
}
if(x<n-1&&y>0&&gird[x+1][y-1]==0)
{
qu.push({x+1,y-1});
gird[x+1][y-1]=1;
}
if(x<n-1&&y<m-1&&gird[x+1][y+1]==0)
{
qu.push({x+1,y+1});
gird[x+1][y+1]=1;
}
}
}
}
}
if(gird[m-1][n-1]==1)
{
std::cout<<"true"<<std::endl;
return true;
}
std::cout<<"false"<<std::endl;
return false;
}
};
int main()
{
std::vector<std::vector<int>> res={{0,0,1,1,1},
{1,0,0,1,1},
{0,1,1,1,1},
{1,0,0,1,1},
{1,1,1,0,0}};
mom so;
//so.canReach_dfs(res);
so.canReach_bfs(res);
return 0;
}