• 剑指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;
            }
        }
    
    }
    

       

  • 相关阅读:
    梦1
    ASP.Net Web Page深入探讨
    创建ASP.NET WEB自定义控件——例程3
    自定义有模板功能的控件
    .net中Web自定义控件编写注意事项
    一个javascript脚本网站
    今天
    Konami世界一代(1)
    使用随机数
    做了一个赋值的测试
  • 原文地址:https://www.cnblogs.com/buaaZhhx/p/11973143.html
Copyright © 2020-2023  润新知