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