[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)