• 剑指offer-拓展训练-N皇后的问题-全排列


    /*
    题目:
    	N皇后的问题。
    */
    /*
    思路:
    	全排列。
    	声明一个具有N个元素的数组curr,每个下标i(0>i>n)代表行,每个curr[i]代表列,所以初始化为curr[i] = i。
    	此时,各皇后既不在一行也不在一列,只需解决对角线的问题。
    	当|i-j|==|curr[i]-curr[j]|时,两个皇后处于一个对角线上。 
    */
    #include<iostream>
    #include<string.h>
    #include<stdio.h>
    #include<set>
    #include<vector>
    
    using namespace std;
    
    
    bool isTrue(int* curr,int len){
        for(int i = 0; i < len; i++){
            for(int j = i+1; j < len; j++){
                if(abs(curr[i] - curr[j]) == j - i ){
                    return false;
                }
            }
        }
        return true;
    }
    void isExist(int* curr,int len,int index,vector<vector<string>> &res){
        if(index == len){
            if(isTrue(curr,len)){
                vector<string> ans;
                //cout<<"["<<endl;
    
                for(int i = 0; i < len; i++){
                    string row = "";
                    for(int j = 0; j < len; j++){
                        row.append(".");
                    }
    
                    row[curr[i]] = 'Q';
                    //cout<<row<<","<<endl;
                    ans.push_back(row);
    
                }
                //cout<<"]"<<endl;
                res.push_back(ans);
                return;
            }
        }
        for(int i = index; i < len; i++){
            int temp = curr[index];
            curr[index] = curr[i];
            curr[i] = temp;
    
            isExist(curr,len,index+1,res);
    
            temp = curr[index];
            curr[index] = curr[i];
            curr[i] = temp;
    
        }
    }
    vector<vector<string>> solveNQueens(int n) {
          int curr[n];
          vector<vector<string>> res;
          for(int i = 0; i < n; i++){
            curr[i] = i;
          }
          isExist(curr,n,0,res);
          return res;
    }
    
    int main(){
        vector<vector<string>> a= solveNQueens(1);
    
        for(int i = 0; i < a.size(); i++){
            for(int j = 0; j < a[i].size(); j++){
                cout<<a[i][j]<<endl;
            }
        }
    
    }
    

       

  • 相关阅读:
    C语言数据类型取值范围
    C语言的概述--学习c的第二天
    开始学习c语言
    Comet 反Ajax: jQuery与PHP实现Ajax长轮询
    jquery的toFixed方法的正确使用
    JavaScript 正则表达式
    JavaScript中原型链存在的问题解析
    vue编程式导航
    vue 动态组件,传递参数
    JavaScript如何封装插件
  • 原文地址:https://www.cnblogs.com/buaaZhhx/p/11973143.html
Copyright © 2020-2023  润新知