zoukankan      html  css  js  c++  java
  • [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;
    	}
    
    };
    

      

  • 相关阅读:
    HTML+CSS笔记 CSS进阶续集
    HTML+CSS笔记 CSS进阶
    HTML+CSS笔记 CSS入门续集
    HTML+CSS笔记 CSS入门
    test
    Python Paramiko模块安装和使用
    RedHat升级Python到2.7.6
    python数据库操作常用功能使用详解(创建表/插入数据/获取数据)
    5、使用EF对后台SysSample数据增删改查
    4、创建SQL数据库,添加EF实体数据模型
  • 原文地址:https://www.cnblogs.com/lautsie/p/4245242.html
Copyright © 2011-2022 走看看