活跃农民
- 积分
- 360
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2014-7-20
- 最后登录
- 1970-1-1
|
- class Solution {
- public:
- //这是我第二题的解法,也可以memo之前的 value, id
- class Point {
- public:
- int x, y;
- int value;
- int id;
- Point(int x, int y, int value=0, int id=0) {
- this->x=x;
- this->y=y;
- this->value=value;
- this->id=id;
- }
- };
- void test() {
- vector<vector<Point*>> points;
- points.push_back({});
- points[0].push_back(new Point(0, 0, 1));
- points[0].push_back(new Point(0, 1, 1));
- points[0].push_back(new Point(0, 2));
- points[0].push_back(new Point(0, 3));
- points[0].push_back(new Point(0, 4));
- points.push_back({});
- points[1].push_back(new Point(1, 0, 1));
- points[1].push_back(new Point(1, 1, 1));
- points[1].push_back(new Point(1, 2));
- points[1].push_back(new Point(1, 3));
- points[1].push_back(new Point(1, 4));
- points.push_back({});
- points[2].push_back(new Point(2, 0));
- points[2].push_back(new Point(2, 1));
- points[2].push_back(new Point(2, 2, 1));
- points[2].push_back(new Point(2, 3));
- points[2].push_back(new Point(2, 4));
- points.push_back({});
- points[3].push_back(new Point(3, 0));
- points[3].push_back(new Point(3, 1));
- points[3].push_back(new Point(3, 2));
- points[3].push_back(new Point(3, 3, 1));
- points[3].push_back(new Point(3, 4, 1));
- points.push_back({});
- points[4].push_back(new Point(4, 0));
- points[4].push_back(new Point(4, 1));
- points[4].push_back(new Point(4, 2));
- points[4].push_back(new Point(4, 3, 1));
- points[4].push_back(new Point(4, 4, 1));
- /*
- 1 1 0 0 0
- 1 1 0 0 0
- 0 0 1 0 0
- 0 0 0 1 1
- 0 0 0 1 1
- */
- vector<vector<Point*>> result = pixelClustering(points, 1, 3);
- }
-
- vector<vector<Point*>> pixelClustering(vector<vector<Point*>>& points, int dist, int counts) {
- if (points.empty() || points.size()==0 || points[0].size()==0) {
- return points;
- }
- vector<vector<Point*>> result=points;
- int newid=1;
- for (int i=0; i<result.size(); i++) {
- for (int j=0; j<result[0].size(); j++) {
- if (result[i][j]->value==1) {
- int counter=1;
- dfsHelper(points, i, j, dist, counter);
- if (counter<counts) {
- cleaner(points, i, j, dist);
- }
- else {
- remarker(points, i, j, dist, newid);
- newid++;
- }
- }
- }
- }
- return result;
- }
-
- private:
- void remarker(vector<vector<Point*>>& points, int x, int y, int dist, int newid) {
- points[x][y]->value=2;
- points[x][y]->id=newid;
- if (x>0) {
- for (int delta=1; delta<=dist; delta++) {
- if (x-delta>=0 && points[x-delta][y]->value==-1) {
- remarker(points, x-delta, y, dist, newid);
- }
- }
- }
- if (x<points.size()-1) {
- for (int delta=1; delta<=dist; delta++) {
- if (x+delta<points.size() && points[x+delta][y]->value==-1) {
- remarker(points, x+delta, y, dist, newid);
- }
- }
- }
- if (y>0) {
- for (int delta=1; delta<=dist; delta++) {
- if (y-delta>=0 && points[x][y-delta]->value==-1) {
- remarker(points, x, y-delta, dist, newid);
- }
- }
- }
- if (y<points[0].size()-1) {
- for (int delta=1; delta<=dist; delta++) {
- if (y+delta<points[0].size() && points[x][y+delta]->value==-1) {
- remarker(points, x, y+delta, dist, newid);
- }
- }
- }
- }
- void cleaner(vector<vector<Point*>>& points, int x, int y, int dist) {
- //clean point value
- points[x][y]->value=0;
- points[x][y]->id=0;
- if (x>0) {
- for (int delta=1; delta<=dist; delta++) {
- if (x-delta>=0 && points[x-delta][y]->value==-1) {
- cleaner(points, x-delta, y, dist);
- }
- }
- }
- if (x<points.size()-1) {
- for (int delta=1; delta<=dist; delta++) {
- if (x+delta<points.size() && points[x+delta][y]->value==-1) {
- cleaner(points, x+delta, y, dist);
- }
- }
- }
- if (y>0) {
- for (int delta=1; delta<=dist; delta++) {
- if (y-delta>=0 && points[x][y-delta]->value==-1) {
- cleaner(points, x, y-delta, dist);
- }
- }
- }
- if (y<points[0].size()-1) {
- for (int delta=1; delta<=dist; delta++) {
- if (y+delta<points[0].size() && points[x][y+delta]->value==-1) {
- cleaner(points, x, y+delta, dist);
- }
- }
- }
- }
-
- void dfsHelper(vector<vector<Point*>>& points, int x, int y, int dist, int& counter) {
- //set to -1 for clean or remark
- points[x][y]->value=-1;
- if (x>0) {
- for (int delta=1; delta<=dist; delta++) {
- if (x-delta>=0 && points[x-delta][y]->value==1) {
- counter++;
- dfsHelper(points, x-delta, y, dist, counter);
- }
- }
- }
- if (x<points.size()-1) {
- for (int delta=1; delta<=dist; delta++) {
- if (x+delta<points.size() && points[x+delta][y]->value==1) {
- counter++;
- dfsHelper(points, x+delta, y, dist, counter);
- }
- }
- }
- if (y>0) {
- for (int delta=1; delta<=dist; delta++) {
- if (y-delta>=0 && points[x][y-delta]->value==1) {
- counter++;
- dfsHelper(points, x, y-delta, dist, counter);
- }
- }
- }
- if (y<points[0].size()-1) {
- for (int delta=1; delta<=dist; delta++) {
- if (y+delta<points[0].size() && points[x][y+delta]->value==1) {
- counter++;
- dfsHelper(points, x, y+delta, dist, counter);
- }
- }
- }
- }
- };
复制代码 |
|