题目链接
思路
- 比较直接,就是用vector去存储每个连通区域,连通区域内的像素点用unordered_set存储,方便之后的查找
- 每次新来一个像素点的时候,就在所有列表中找他是否属于某个邻域,如果是的话,则将所有的这些邻域进行合并。否则就新建一个unordered_set,保存这个新的land即可。
- 总结:滴滴的题目主要是有了思路就得立马写,流程比较复杂,但是一些技巧性的算法可能涉及的不太多。
代码
#include <cstdlib>
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
#include <sstream>
#include <unordered_map>
#include <unordered_set>
#include <map>
#include <set>
#include <stdio.h>
#include <numeric>
#include <algorithm>
#include <functional>
#include <stack>
#include <queue>
#include <cmath>
#include <assert.h>
#include <vector>
#include <memory>
#include <memory.h>
using namespace std;
typedef long long ll;
const int MOD = 1e9 + 7;
typedef unsigned char uchar;
//#define G_DEBUG
int dirs4[5][2] = { -1, 0, 1, 0, 0, 0, 0, 1, 0, -1 };
struct pairhash {
public:
template <typename T, typename U>
std::size_t operator()(const std::pair<T, U> &x) const
{
return std::hash<T>()(x.first) ^ std::hash<U>()(x.second);
}
};
int main()
{
#ifdef G_DEBUG
// 调试使用
int N = 2;
string str1 = "abab";
string str2 = "ababab";
#else
int rows = 0, cols = 0;
int count = 0;
cin >> rows >> cols >> count;
#endif
vector<unordered_set<pair<int, int>, pairhash>> pairs;
int curr_r = 0, curr_c = 0;
int result = 0;
for (int i = 0; i < count; i++)
{
cin >> curr_r >> curr_c;
if ((curr_r < 0 || curr_r >= rows)
|| (curr_c < 0 || curr_c >= cols))
{
if (i == 0)
cout << pairs.size();
else
cout << " " << pairs.size();
continue;
}
vector<int> need_cmb;
for (int k = 0; k < pairs.size(); k++)
{
bool found = false;
auto& curr_pair = pairs[k];
for (int j = 0; j < 5; j++)
{
int tmp_r = curr_r + dirs4[j][0];
int tmp_c = curr_c + dirs4[j][1];
if ((tmp_r < 0 || tmp_r >= rows)
|| (tmp_c < 0 || tmp_c >= cols))
continue;
if (curr_pair.find(pair<int, int>(tmp_r, tmp_c)) != curr_pair.end())
{
curr_pair.insert(pair<int, int>(curr_r, curr_c));
found = true;
break;
}
}
if (found)
{
need_cmb.push_back( k );
}
}
if (need_cmb.empty())
{
pairs.resize( pairs.size()+1 );
pairs.back().insert( pair<int,int>(curr_r, curr_c) );
}
else if (need_cmb.size() > 1)
{
for (int k = need_cmb.size() - 1; k >= 1; k--)
{
for (auto c : pairs[need_cmb[k]])
{
pairs[need_cmb[0]].insert( c );
}
pairs.erase( pairs.begin()+need_cmb[k] );
}
}
if (i == 0)
cout << pairs.size();
else
cout << " " << pairs.size();
}
cout << endl;
system("pause");
return 0;
}