c_cpp N Queens(回溯)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp N Queens(回溯)相关的知识,希望对你有一定的参考价值。

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

// #Backtracking #BasicProblem

int valid(int x,int y,vector< vector<int> > a){
    int n=a.size();
    if(x>=0 && x<n && y>=0 && y<n && a[x][y]==0){
        for(int i=0;i<n;i++){
            if(a[i][y]==1){
                return 0; //checking col
            }
        }
        /*
        for(int i=0;i<n;i++){
            if(a[x][i]==1){
                return 0;
            }
        }
        */
        int i=x,j=y;
        while(i<n && j<n){
            if(a[i][j]==1){
                return 0;
            }
            i++,j++;
        }
        i=x,j=y;
        while(i>=0 && j>=0){
            if(a[i][j]==1){
                return 0;
            }
            i--,j--;
        }
        i=x,j=y;
        while(i>=0 && j<n){
            if(a[i][j]==1){
                return 0;
            }
            i--,j++;
        }
        i=x,j=y;
        while(i<n && j>=0){
            if(a[i][j]==1){
                return 0;
            }
            i++,j--;
        }
        return 1;
    }else{
        return 0;
    }
}
int bt(vector< vector<int> > &a,int x,int y,int moves){
    int n=a.size();
    if(valid(x,y,a)==1){
        if(moves==n-1){
            a[x][y]=1;
            return 1;
        }
            a[x][y]=1;
            moves++;
            for(int j=0;j<n;j++){
                if(bt(a,x+1,j,moves)==1){
                    return 1;
                }
            }
            moves--;
            a[x][y]=0;
            return 0;
    }
    return 0;
}
void solve(int n){
     vector< vector<int> > a(n);
	 for(int i=0;i<n;i++){
	     a[i].resize(n);
	 }
	 int moves=0;  
	
	    int flag=0;
	 for(int i=0;i<n;i++){
	     if(bt(a,0,i,moves)==1){
	        flag=1;
	        break;
	     }
	 }
	 
	 if(flag==0){
	     cout<<"No solution"<<endl;
	 }else{
	     for(int i=0;i<n;i++){
	        for(int j=0;j<n;j++){
	            cout<<a[i][j]<<" ";
	        }
	        cout<<endl;
	    }
	 }
	    
}

int main() {
	int t;
	cin>>t;
	while(t--){
	    int n;
	    cin>>n;
	    solve(n);
	}
	return 0;
}

以上是关于c_cpp N Queens(回溯)的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode 52 N-Queens II 回溯搜索

N-Queens

N Queens Puzzle - 此解决方案中的回溯在哪里?

leetcode 51. N-Queens N 皇后(困难)

回溯经典n皇后的时间复杂度分析

51.N-Queens