基本思路:
130题的升级版,但是难在如何保存形状;
示例给了两种方案:
1.针对于坐标差来保存;
2.根据访问的顺序表示,向上为1,向下为2,向左为3,向右为4;
两者能成功都是因为形状不能旋转,若两岛屿形状相同,则访问的初始点必定相同,因此访问次序相同情况下,序列记录也一定相同;
后续通过set去重即可;
总体代码:
class Solution {
public:
void dfs(vector<string>& trans,vector<vector<int>>& grid,int ox,int oy,int nx,int ny,int m,int n){
if(nx<0||nx>=m||ny<0||ny>=n||grid[nx][ny]==0)
return;
grid[nx][ny]=0;
string s="";
s+='0'+(nx-ox);
s+='0'+(ny-oy);
trans.push_back(s);
dfs(trans,grid,ox,oy,nx+1,ny,m,n);
dfs(trans,grid,ox,oy,nx-1,ny,m,n);
dfs(trans,grid,ox,oy,nx,ny+1,m,n);
dfs(trans,grid,ox,oy,nx,ny-1,m,n);
}
int numDistinctIslands(vector<vector<int>>& grid) {
int m=grid.size();
int n=grid[0].size();
set<vector<string>>lines;
for(int i=0;i<grid.size();i++){
for(int j=0;j<grid[i].size();j++){
if(grid[i][j]==1){
vector<string>trans;
dfs(trans,grid,i,j,i,j,m,n);
lines.insert(trans);
}
}
}
return lines.size();
}
};