1 条题解

  • 0
    @ 2026-4-13 14:50:53
    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=101;
    int n; // n*n的棋盘
    int cnt=0; // 方案数 
    int place[maxn]; // place[行号]=列号,用于表示每行的皇后放在哪一列上
    bool cols[maxn]; // cols[列号]=0或1,表示该列上是否有皇后了
    bool lt[maxn]; // lt[编号]=0或1,表示该编号的左对角线上是否有皇后了
    bool rt[maxn]; // rt[编号]=0或1,表示该编号的右对角线上是否有皇后了
    
    void dfs(int i){ // i表示行,j表示列 
    	if(i>n){
    		cnt++;
    		return;
    	}
    	//开始遍历当前行的每一列
    	for(int j=1;j<=n;j++){
    		//开始剪枝,判断当前位置是否能放皇后(当前位置所在的列、左斜线、右斜线没有皇后)
    		if(cols[j]==false && lt[i-j+n]==false && rt[i+j]==false){
    			//在当前位置放置皇后
    			place[i]=j;
    			cols[j]=true;
    			lt[i-j+n]=true;
    			rt[i+j]=true;
    			//递归到下一行,继续放置皇后
    			dfs(i+1);
    			//回溯(撤销上述操作)
    			place[i]=0;
    			cols[j]=false;
    			lt[i-j+n]=false;
    			rt[i+j]=false;
    		}
    	} 
    }
    
    int main(){
    	cin >> n;
    	//
    	dfs(1); //从棋盘的第一行开始放置皇后
    	//
    	cout << cnt;
    	//
    	return 0; 
    }
     
    

    信息

    ID
    1268
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    4
    已通过
    4
    上传者