N皇后问题

it2025-11-02  3

问题描述: 在n*n棋盘上,每一行放置一个皇后; 要求所有皇后所处位置:不同行、不同列、不同对角线; 解决思想:

1.使用q[N]一维数据存放皇后位置:q[2]=3:表示皇后放置在第2行第3列 2.打印可以直接在某次直接调用后执行:show() 3.对角线处理:判断是否为等腰三角形:abs(k-i)==abs(q[k]-j 样例输入: 6 样例输出: 方案1 [1 2] [2 4] [3 6] [4 1] [5 3] [6 5] 方案2 [1 3] [2 6] [3 2] [4 5] [5 1] [6 4] 方案3 [1 4] [2 1] [3 5] [4 2] [5 6] [6 3] 方案4 [1 5] [2 3] [3 1] [4 6] [5 4] [6 2]

AC代码(c++):

#include<bits/stdc++.h> using namespace std; #define N 20 int cnt=1; int q[N]; //判断此位置是否可以放置皇后 bool isplace(int i,int j){ bool flag=true; int k=1; if(i==1){ return true; } while(k<i){ if(q[k]==j||abs(k-i)==abs(q[k]-j)){ flag=false; break; } k++; } return flag; } //打印函数 void show(int n){ cout<<cnt++<<endl; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(q[i]==j){ cout<<"["<<i<<" "<<j<<" ]"; } } } cout<<endl; } //递归体 void qu(int i,int n){ //出口 if(i>n){ show(n); } else{ for(int j=1;j<=n;j++){ if(isplace(i,j)){ q[i]=j; qu(i+1,n); } } } } //主函数 int main(){ int n; cin>>n; qu(1,n); return 0; }
最新回复(0)