[topcoder]TheGridDivTwo

http://community.topcoder.com/stat?c=problem_statement&pm=13628&rd=16278

标程是BFS,我用DFS,都可解。

这里复杂的把pair写了hash函数,其实直接用个矩阵来存bool就可以了。

#include <vector>
#include <algorithm>
#include <unordered_set>
#include <utility>

using namespace std;

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) * 37 ^ std::hash<U>()(x.second);
  }
};

class TheGridDivTwo {
public:
	unordered_set<pair<int, int>, pairhash> visited;
	unordered_set<pair<int, int>, pairhash> block;

	int find(vector <int> x, vector <int> y, int k) {
		for (int i = 0; i < x.size(); i++) {
			block.insert(make_pair(x[i], y[i]));
		}
		int result = 0;
		pair<int, int> start = make_pair(0, 0);
		findRe(result, start, k, 0);
		return result;
	}

	void findRe(int &result, pair<int, int> &p, int k, int step) {
		visited.insert(p);
		if (step == k) {
			result = max(result, p.first);
		} else {
			int dx[4] = {1, 0, 0, -1};
			int dy[4] = {0, 1, -1, 0};
			for (int i = 0; i < 4; i++) {
				pair<int, int> tmp = make_pair(p.first + dx[i], p.second + dy[i]);
				if (tmp.first + k - step > result && valid(tmp)) {
					findRe(result, tmp, k, step + 1);
				}
			}
		}
		visited.erase(p);
	}

	bool valid(pair<int, int> &p) {
		if (block.find(p) != block.end() || visited.find(p) != visited.end()) {
			return false;
		}
		return true;
	}

};

  

posted @ 2015-01-23 23:14  阿牧遥  阅读(373)  评论(0编辑  收藏  举报