classSolution{public:intnumDistinctIslands(vector<vector<int>>&grid){constintm=grid.size();constintn=grid[0].size();set<vector<pair<int,int>>>islands;// All different islandsvector<vector<bool>>seen(m,vector<bool>(n));for(inti=0;i<m;++i)for(intj=0;j<n;++j){vector<pair<int,int>>island;dfs(grid,i,j,i,j,seen,island);if(!island.empty())islands.insert(island);}returnislands.size();}private:voiddfs(constvector<vector<int>>&grid,inti,intj,inti0,intj0,vector<vector<bool>>&seen,vector<pair<int,int>>&island){if(i<0||i==grid.size()||j<0||j==grid[0].size())return;if(grid[i][j]==0||seen[i][j])return;seen[i][j]=true;island.emplace_back(i-i0,j-j0);dfs(grid,i+1,j,i0,j0,seen,island);dfs(grid,i-1,j,i0,j0,seen,island);dfs(grid,i,j+1,i0,j0,seen,island);dfs(grid,i,j-1,i0,j0,seen,island);}};
classSolution{publicintnumDistinctIslands(int[][]grid){finalintm=grid.length;finalintn=grid[0].length;Set<List<Pair<Integer,Integer>>>islands=newHashSet<>();// All different islandsboolean[][]seen=newboolean[m][n];for(inti=0;i<m;++i)for(intj=0;j<n;++j){List<Pair<Integer,Integer>>island=newArrayList<>();dfs(grid,i,j,i,j,seen,island);if(!island.isEmpty())islands.add(island);}returnislands.size();}privatevoiddfs(int[][]grid,inti,intj,inti0,intj0,boolean[][]seen,List<Pair<Integer,Integer>>island){if(i<0||i==grid.length||j<0||j==grid[0].length)return;if(grid[i][j]==0||seen[i][j])return;seen[i][j]=true;island.add(newPair<>(i-i0,j-j0));dfs(grid,i+1,j,i0,j0,seen,island);dfs(grid,i-1,j,i0,j0,seen,island);dfs(grid,i,j+1,i0,j0,seen,island);dfs(grid,i,j-1,i0,j0,seen,island);}}
classSolution:defnumDistinctIslands(self,grid:List[List[int]])->int:seen=set()defdfs(i:int,j:int,i0:int,j0:int):ifi<0ori==len(grid)orj<0orj==len(grid[0]):returnifgrid[i][j]==0or(i,j)inseen:returnseen.add((i,j))island.append((i-i0,j-j0))dfs(i+1,j,i0,j0)dfs(i-1,j,i0,j0)dfs(i,j+1,i0,j0)dfs(i,j-1,i0,j0)islands=set()# All different islandsforiinrange(len(grid)):forjinrange(len(grid[0])):island=[]dfs(i,j,i,j)ifisland:islands.add(frozenset(island))returnlen(islands)