class Solution {
public:
/**
* 判断岛屿数量
* @param grid char字符型vector<vector<>>
* @return int整型
*/
//本题的思路为采用深度优先遍历,如果当前来到的是1且没有走过那就看这个位置的上下左右哪个位置是1就往哪走
//用used数组标记一个位置是否被走过
int res=0;//最终的返回结果
bool used[10000][10000];
int solve(vector<vector<char> >& grid) {
// write code here
int rows=grid.size();//行数
int cows=grid[0].size();//列数
for(int i=0;i<rows;i++){
for(int j=0;j<cows;j++)
used[i][j]=true;//初始化
}
for(int i=0;i<grid.size();i++){
for(int j=0;j<grid[i].size();j++){
if(grid[i][j]=='1'&&used[i][j]==true){
res++;
used[i][j]=false;
process(grid, i, j);
}
}
}
return res;
}
//该函数的含义为从row行cow列开始走,只能走为1且没走过的地方,把所有能走的地方走一次且仅走一次
void process(vector<vector<char> >grid,int row,int cow)
{
//base case
//当来到一个地方时它的上下左右全都是0或者都走过此时说明已经把所有能走的地方都走了一遍,返回
if(row>=grid.size()||cow>=grid[0].size())//越界
return;
//可以往上走
if(row-1>=0&&grid[row-1][cow]=='1'&&used[row-1][cow]){//说明此时可以往上走
used[row-1][cow]=false;//修改used数组,说明这个位置已经被走过
process(grid, row-1, cow);
}
//注意这里不能用else if
//如果可以往下走
if(row+1<grid.size()&&grid[row+1][cow]=='1'&&used[row+1][cow]){
used[row+1][cow]=false;
process(grid, row+1, cow);
}
//可以往左走
if(cow-1>=0&&grid[row][cow-1]=='1'&&used[row][cow-1]){
used[row][cow-1]=false;
process(grid, row, cow-1);
}
//可以往右走
if(cow+1<grid[0].size()&&grid[row][cow+1]=='1'&&used[row][cow+1]){
used[row][cow+1]=false;
process(grid, row, cow+1);
}
//上下左右四个方向能走的都走了一遍,返回
return;
}
};
public:
/**
* 判断岛屿数量
* @param grid char字符型vector<vector<>>
* @return int整型
*/
//本题的思路为采用深度优先遍历,如果当前来到的是1且没有走过那就看这个位置的上下左右哪个位置是1就往哪走
//用used数组标记一个位置是否被走过
int res=0;//最终的返回结果
bool used[10000][10000];
int solve(vector<vector<char> >& grid) {
// write code here
int rows=grid.size();//行数
int cows=grid[0].size();//列数
for(int i=0;i<rows;i++){
for(int j=0;j<cows;j++)
used[i][j]=true;//初始化
}
for(int i=0;i<grid.size();i++){
for(int j=0;j<grid[i].size();j++){
if(grid[i][j]=='1'&&used[i][j]==true){
res++;
used[i][j]=false;
process(grid, i, j);
}
}
}
return res;
}
//该函数的含义为从row行cow列开始走,只能走为1且没走过的地方,把所有能走的地方走一次且仅走一次
void process(vector<vector<char> >grid,int row,int cow)
{
//base case
//当来到一个地方时它的上下左右全都是0或者都走过此时说明已经把所有能走的地方都走了一遍,返回
if(row>=grid.size()||cow>=grid[0].size())//越界
return;
//可以往上走
if(row-1>=0&&grid[row-1][cow]=='1'&&used[row-1][cow]){//说明此时可以往上走
used[row-1][cow]=false;//修改used数组,说明这个位置已经被走过
process(grid, row-1, cow);
}
//注意这里不能用else if
//如果可以往下走
if(row+1<grid.size()&&grid[row+1][cow]=='1'&&used[row+1][cow]){
used[row+1][cow]=false;
process(grid, row+1, cow);
}
//可以往左走
if(cow-1>=0&&grid[row][cow-1]=='1'&&used[row][cow-1]){
used[row][cow-1]=false;
process(grid, row, cow-1);
}
//可以往右走
if(cow+1<grid[0].size()&&grid[row][cow+1]=='1'&&used[row][cow+1]){
used[row][cow+1]=false;
process(grid, row, cow+1);
}
//上下左右四个方向能走的都走了一遍,返回
return;
}
};