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

       

  • 相关阅读:
    ACCP7.0-S2-复习自测-15测试分析
    线程
    多线程下的单例模式
    combobox 属性、事件、方法
    java的多线程总结
    爬虫--登录网页
    shell--字符串是否为空
    python--正则表达式 字符串匹配
    mysql---表所在数据库
    python--日期操作
  • 原文地址:https://www.cnblogs.com/buaaZhhx/p/11973143.html
Copyright © 2011-2022 走看看