Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) connected 4-directionally (horizontal or vertical.) You may assume all four edges of the grid are surrounded by water.

Count the number of distinct islands. An island is considered to be the same as another if they have the same shape, or have the same shape after rotation (90, 180, or 270 degrees only) or reflection (left/right direction or up/down direction).

Example 1:

11000
10000
00001
00011

Given the above grid map, return 1.

Notice that:

11
1

and

 1
11

are considered same island shapes. Because if we make a 180 degrees clockwise rotation on the first island, then two islands will have the same shapes.

Example 2:

11100
10001
01001
01110

Given the above grid map, return 2.

Here are the two distinct islands:

111
1

and

1
1

Notice that:

111
1

and

1
111

are considered same island shapes. Because if we flip the first array in the up/down direction, then they have the same shapes.

Note: The length of each dimension in the given grid does not exceed 50.

这道题的难度比较大,涉及到的细节也很多,是一道很好的题。

注意几个细节:

1. set 由红黑树实现,unordered_set由哈希表实现,所以想要给vector去重,要用set。

2. for(auto l : s) ... 这个时候l是一个value,而for(auto &l : s) ... 这个时候l是一个reference。

3. 上下左右翻转,旋转90,180,270,对于一个(x,y)来讲正好对应8种情况。((+/-)(x/y),(+/-)()),可以自己推一遍。

4. 在norm函数里,有两次排序,这两次排序至关重要,第一次是对每一个翻转情况中的点进行排序,这一次排序的目的是为了让

两个ISLAND对应的翻转中最小的点排到第一个来,这样做的目的是因为只有这样,之后两个ISLAND以该点作为原点进行计算时,

两个ISLAND才能得到一样的点的序列。

第二次排序是为了在所有可能中拿点序最小的一个,拿最大也可以,只要把这八个可能用一个来表示就行了,然后插入集合中,利用

set进行去重。

好题。

#include "header.h"
#include <unordered_set>
#define ALL(x) (x).begin(), (x).end()
#define FOR(i, a, b) for (remove_cv<remove_reference<decltype(b)>::type>::type i = (a); i < (b); i++)
#define REP(i, n) FOR(i, 0, n)
#define PRINT1D(x) do {REP(i,(x).size()) cout << x[i] << " "; cout << endl;} while 0; #define PRINT1D(X) \
{ \
REP(i, (X).size()){ \
cout << (X)[i] << " "; \
} \
cout << endl; \
} \ #define PRINT2D(X) \
{ \
REP(i, (X).size()){ \
REP(j,(X)[].size()){ \
cout << (X)[i][j] << " "; \
} \
cout << endl; \
} \
cout << endl; \
} \ class Solution {
private:
unordered_map<int, vector<pair<int,int> > > map;
public:
void dfs(vector<vector<int>>& grid, int r, int c, int cnt){
grid[r][c] = ;
map[cnt].push_back({r,c});
int n = grid.size();
int m = grid[].size();
if(r < n && r >= && c < m && c >= && grid[r][c] == ){
dfs(grid, r+, c, cnt);
dfs(grid, r, c+, cnt);
dfs(grid, r-, c, cnt);
dfs(grid, r, c-, cnt);
}
} vector<pair<int,int>> norm(vector<pair<int,int>> originalshape){
vector<vector<pair<int,int>>> s();
//sort(ALL(originalshape));
for(auto p : originalshape){
int x = p.first, y = p.second;
s[].push_back({x,y});
s[].push_back({x,-y});
s[].push_back({-x,-y});
s[].push_back({-x,y});
s[].push_back({y,-x});
s[].push_back({-y,-x});
s[].push_back({-x,-y});
s[].push_back({y,x});
}
//sort(ALL(s));
for(auto &l : s ) sort(ALL(l));
for(auto &l : s){
auto l1st = l[];
REP(i,l.size()){
l[i].first = l[i].first - l1st.first;
l[i].second = l[i].second - l1st.second;
}
l1st.first = ;
l1st.second = ;
}
sort(ALL(s));
return s[];
}; int numDistinctIslands2(vector<vector<int>>& grid) {
set<vector<pair<int,int>>> s;
int cnt = ;
REP(i,grid.size()){
REP(j,grid[].size()){
if(grid[i][j] == ){
dfs(grid, i, j, ++cnt);
s.insert(norm(map[cnt]));
}
}
}
return s.size();
}
}; int main() {
vector<vector<int>> mtx(,vector<int>(,));
set<vector<int>>s;
Solution s1 = Solution();
s1.numDistinctIslands2(mtx);
}

LC 711. Number of Distinct Islands II的更多相关文章

  1. [LeetCode] 711. Number of Distinct Islands II 不同岛屿的个数之二

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

  2. [LeetCode] Number of Distinct Islands II 不同岛屿的个数之二

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

  3. [LeetCode] 711. Number of Distinct Islands II_hard tag: DFS

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

  4. [LeetCode] Number of Distinct Islands 不同岛屿的个数

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

  5. [LeetCode] 694. Number of Distinct Islands 不同岛屿的个数

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

  6. 694. Number of Distinct Islands 形状不同的岛屿数量

    [抄题]: Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land ...

  7. leetcode 200. Number of Islands 、694 Number of Distinct Islands 、695. Max Area of Island 、130. Surrounded Regions

    两种方式处理已经访问过的节点:一种是用visited存储已经访问过的1:另一种是通过改变原始数值的值,比如将1改成-1,这样小于等于0的都会停止. Number of Islands 用了第一种方式, ...

  8. [LeetCode] 694. Number of Distinct Islands

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

  9. LeetCode - Number of Distinct Islands

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

随机推荐

  1. vue入门 0 小demo (挂载点、模板、实例)

    vue入门 0 小demo  (挂载点.模板) 用直接的引用vue.js 首先 讲几个基本的概念 1.挂载点即el:vue 实例化时 元素挂靠的地方. 2.模板 即template:vue 实例化时挂 ...

  2. 在 Sublime Text 3 中使用 SublimeClang 插件

    SublimeClang 是 Sublime Text 中唯一的 C/C++ 自动补全插件,功能强大,自带语法检查功能,可惜目前作者停止更新了,而且只支持 Sublime Text 2.今晚在 ST ...

  3. Python lambda 知识点

    作者说学会了lambda后,你会用上瘾的,因为让代码复用和简洁. 初识lamdba不太好理解,尤其是它能当着一个变量传递给函数,不过多学着写几个例子就好了,下面是我的学习笔记. lambda 操作符( ...

  4. Ubuntu18.04安装破解版MATLAB2018b

    参考链接: Ubuntu 18.04安装破解Matlab 2018b及创建快捷方式的详细教程(附图) Linux下安装JDK遇到的问题之cp: 无法获取"jdk-8u191-linux-i5 ...

  5. XMLHttpRequest status为0

    //创建XMLHttpRequest()对象 var request = new XMLHttpRequest();  ...... 今天写一个ajax , 明明是有结果返回的,但得到的request ...

  6. HttpRunner完整笔记(从搭建到应用)

    一.安装 (1)       直接python2 –m pip install HttpRunner,安装完成后,可使用hrun –V 来查看安装版本:python2 pip install -U H ...

  7. 【u-boot】u-boot中initf_dm()函数执行流程(转)

    前部分设备模型初始化 为了便于阅读,删掉部分代码,只留关键的过程: static int initf_dm(void){    int ret;    ret = dm_init_and_scan(t ...

  8. python wechat

    Python _ithcat持续登陆问题(itchat.auto_login(hotReload=True) https://blog.csdn.net/weixin_43886198/article ...

  9. BZOJ1821 部落划分[最小生成树]

    方法一:套路性的,二分距离,然后把距离点对距离小于答案的边都联通起来,然后看集合数量超过k说明答案小,增大,否则减小. 方法二:贪心,类kruskal.n个点,k个连通块,则需要有效连接(同一个块内的 ...

  10. vue项目 WebViewJavascriptBridge 适配android和ios

    前言 最近在app 原生页面 嵌套 做Vue 的H5,混合开发,当然原生和Vue 交互方面当然用到 WebViewJavascriptBridge 这个东西啦, 当然在用到的时候也有问题,可以参考大佬 ...