n后问题

/*************************************************************************
  * File Name: Solution.cpp
  * Description: 
  * Author: Yuji CAO
  * Mail: caoyuji@sogou-inc.com
  * Created_Time: 2015-07-29 16时46分53秒
  * Last modified: 2015-07-29 16时46分53秒
 ************************************************************************/
#include<iostream>
#include<vector>
#include<string>
#include<map>
#include<set>
using namespace std;
bool isAvailable(vector<char>&path,int n,int l,int pos){
    for(int i=0;i<l;++i){
        for(int j=0;j<n;++j){
            if(path[i*n+j]=='Q'){
                if(j==pos){
                    return false;
                }else if((i-l)==(j-pos)||(i-l)==(-j+pos)){
                    return false;
                }
            }
        }
    }
    return true;
}
void nqueue(vector< vector<char> >&ret,vector<char>& path,int n,int l){
    if(l==n){
        //push path to ret
        /*
        int i=0;
        for(auto ele:path){
            printf("%2c",ele);
            i++;
            if(i%n==0){
                cout<<endl;
            }
        }
        printf("\n");
        */
        ret.push_back(path);
    }
    for(int i=0;i<n;++i){
        if(isAvailable(path,n,l,i)){
            path[l*n+i]='Q';
            nqueue(ret,path,n,l+1);
            path[l*n+i]='X';
        }
    }
}
vector< vector<char> > nqueue(int n){
    vector< vector<char> > ret;
    vector<char> path;
    path.resize(n*n);
    for(int i=0;i<n*n;++i){
        path[i]='X';
    }
    nqueue(ret,path,n,0);
    return ret;
}
int main(){
    vector< vector<char> > ret=nqueue(4);
    for(auto eleI:ret){
        int i=0;
        for(auto eleJ:eleI){
            printf("%2c",eleJ);
            i++;
            if(i%4==0){
                printf("\n");
            }
        }
        printf("\n");
    }
    return 0;
}

分析

n后问题的解法是典型的暴力枚举法。值得研究~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值