• Leetcode: n-queen, n-queen II


    思路:

    题目给出的测试数据范围比较小, 使用回溯就可以AC, 搞的我也没有兴趣去研究高效解法了

    总结:

    刚开始, 本以为用棋盘问题的状态压缩 DP 就可以解决, 但做完 N-queen 才发现多个皇后并不能在同一条斜线上, 状态压缩的解法似乎就不好用了

    代码:

    #include <iostream>
    #include <vector>
    #include <string>
    using namespace std;
    class Solution {
    public:
    	int N;
    	vector<int> pos;
    	int result;
    	bool visited[10];
    
    	bool attack(const int &row, const int &col) {
    		for(int i = 0; i < pos.size(); i ++) {
    			if(abs(pos[i]-col) == abs(i-row))
    				return true;
    		}
    		return false;
    	}
    	void dfs(const int &depth) {
    		if( depth == N) {
    			result += 1;
    		}
    		for(int i = 0; i < N; i ++) {
    			if(visited[i] == 0 ) {
    				if( pos.size() > 0 && attack(depth, i))
    					continue;
    				visited[i] = 1;
    				pos.push_back(i);
    				dfs(depth+1);
    				pos.pop_back();
    				visited[i] = 0;
    			}
    			
    		}
    	}
        int totalNQueens(int n) {
    		pos.clear();
    		result=0;
    		memset(visited, 0, sizeof(visited));
            N = n;
    		dfs(0);
    		return result;
        }
    };
    int main() {
    	Solution solution;
    	int res = solution.totalNQueens(9);
    	cout << res << endl;
    	return 0;
    }
    
    #include <iostream>
    #include <vector>
    #include <string>
    using namespace std;
    class Solution {
    public:
    	int N;
    	vector<int> pos;
    	vector<vector<string> > result;
    	bool visited[10];
    
    	bool attack(const int &row, const int &col) {
    		for(int i = 0; i < pos.size(); i ++) {
    			if(abs(pos[i]-col) == abs(i-row))
    				return true;
    		}
    		return false;
    	}
    	void dfs(const int &depth) {
    		if( depth == N) {
    			vector<string> temp;
    			string str;
    			for(int i = 0; i < N; i ++) {
    				str.clear();
    				for(int j = 0; j < N; j ++) {
    					if(pos[i] == j)
    						str.push_back('Q');
    					else
    						str.push_back('.');
    				}
    				temp.push_back(str);
    			}
    			result.push_back(temp);		
    		}
    		for(int i = 0; i < N; i ++) {
    			if(visited[i] == 0 ) {
    				if( pos.size() > 0 && attack(depth, i))
    					continue;
    				visited[i] = 1;
    				pos.push_back(i);
    				dfs(depth+1);
    				pos.pop_back();
    				visited[i] = 0;
    			}
    			
    		}
    	}
        vector<vector<string> > solveNQueens(int n) {
    		pos.clear();
    		result.clear();
    		memset(visited, 0, sizeof(visited));
            N = n;
    		dfs(0);
    		return result;
        }
    };
    

      

  • 相关阅读:
    C#中的委托(转)
    面试总结
    int, Int32.Parse和Convert.ToInt32的不同之处(分享)
    数据结构与算法基础学习(一)
    SVN服务器搭建和使用(二)
    WCF学习笔记(第一天,1.WCF概述)
    在此计算机中仅有部分visual studio2010产品已升级到SP1,只有全部升级,产品才能正常运行解决办法
    FormsAuthentication使用指南
    Why do I get the error "The target GatherAllFilesToPublish does not exist"?
    非彼拉且数列的实现
  • 原文地址:https://www.cnblogs.com/xinsheng/p/3439154.html
Copyright © 2020-2023  润新知