问题:
给定一个由0和1组成的非空的二维网格,一个岛屿是指四个方向(包括横向和纵向)都相连的一组1(1表示陆地)。你可以假设网格的四个边缘都被水包围。
找出所有不同的岛屿的个数。如果一个岛屿与另一个岛屿形状相同(不考虑旋转和翻折),我们认为这两个岛屿是相同的。
注意:
11
1
和
1
11
是不同的岛屿,因为我们不考虑旋转和翻折。
样例
样例 1:
输入: [ [1,1,0,0,1], [1,0,0,0,0], [1,1,0,0,1], [0,1,0,1,1] ] 输出: 3 解释: 11 1 1 1 11 11 1
样例 2:
输入: [ [1,1,0,0,0], [1,1,0,0,0], [0,0,0,1,1], [0,0,0,1,1] ] 输出: 1
注意事项
网格的每一个维度的长度都不超过50
。
python:
class Solution:
"""
@param grid: a list of lists of integers
@return: return an integer, denote the number of distinct islands
"""
def changeToFalse(self, grid, m, n, mMin, mMax, nMin, nMax):
if m < 0 or m >= len(grid) or n < 0 or n >= len(grid[0]):
return
if grid[m][n] == 1:
grid[m][n] = 2
Mmin = min(m, mMin[0])
del mMin[0]
mMin.append(Mmin)
Mmax = max(m, mMax[0])
del mMax[0]
mMax.append(Mmax)
Nmin = min(n, nMin[0])
del nMin[0]
nMin.append(Nmin)
Nmax = max(n, nMax[0])
del nMax[0]
nMax.append(Nmax)
self.changeToFalse(grid, m-1, n, mMin, mMax, nMin, nMax)
self.changeToFalse(grid, m+1, n, mMin, mMax, nMin, nMax)
self.changeToFalse(grid, m, n-1, mMin, mMax, nMin, nMax)
self.changeToFalse(grid, m, n+1, mMin, mMax, nMin, nMax)
def numberofDistinctIslands(self, grid):
# write your code here
if len(grid) == 0 or len(grid[0]) == 0:
return 0
resultStr = []
for i in range(len(grid)):
for j in range(len(grid[i])):
if grid[i][j] == 1:
mMin = []
mMin.append(i)
mMax = []
mMax.append(i)
nMin = []
nMin.append(j)
nMax = []
nMax.append(j)
self.changeToFalse(grid, i, j, mMin, mMax, nMin, nMax)
temp = ""
flag = False
for p in range(mMin[0], mMax[0]+1, 1):
for q in range(nMin[0], nMax[0]+1, 1):
temp = temp + str(grid[p][q])
temp += "_"
if len(resultStr) == 0:
resultStr.append(temp)
else:
for index in range(len(resultStr)):
if resultStr[index] == temp:
flag = True
break
if flag == False:
resultStr.append(temp)
return len(resultStr)
C++:
class Solution {
public:
/**
* @param grid: a list of lists of integers
* @return: return an integer, denote the number of distinct islands
*/
void changeToFalse(vector<vector<int>> &grid, int m, int n, int &mMin, int &mMax, int &nMin, int &nMax)
{
if (m < 0 || m >= grid.size() || n < 0 || n >= grid[0].size())
{
return;
}
if (grid[m][n] == 1)
{
grid[m][n] = 2;
mMin = min(m, mMin);
mMax = max(m, mMax);
nMin = min(n, nMin);
nMax = max(n, nMax);
changeToFalse(grid, m - 1, n, mMin, mMax, nMin, nMax);
changeToFalse(grid, m + 1, n, mMin, mMax, nMin, nMax);
changeToFalse(grid, m, n - 1, mMin, mMax, nMin, nMax);
changeToFalse(grid, m, n + 1, mMin, mMax, nMin, nMax);
}
}
int numberofDistinctIslands(vector<vector<int>> &grid) {
// write your code here
if (grid.size() == 0 || grid[0].size() == 0)
{
return 0;
}
vector<string> resultStr;
for (int i = 0; i < grid.size(); i++)
{
for (int j = 0; j < grid[i].size(); j++)
{
if (grid[i][j] == 1)
{
int mMin = i;
int mMax = i;
int nMin = j;
int nMax = j;
changeToFalse(grid, i, j, mMin, mMax, nMin, nMax);
string temp = "";
bool flag = false;
for (int p = mMin; p <= mMax; p++)
{
for (int q = nMin; q <= nMax; q++)
{
temp = temp + to_string(grid[p][q]);
}
temp += "_";
}
if (resultStr.empty())
{
resultStr.push_back(temp);
}
else {
for (int index = 0; index < resultStr.size(); index++)
{
if (resultStr[index] == temp)
{
flag = true;
break;
}
}
if (flag == false)
{
resultStr.push_back(temp);
}
}
}
}
}
return resultStr.size();
}
};
PS:python之所以复杂一点是因为传参问题,如果能简化请告知