首页 > 代码库 > [topcoder]TheGridDivTwo
[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; }};
[topcoder]TheGridDivTwo
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。