N*N棋盘如何放置M个皇后

题目描述:

我们对八皇后问题进行扩展。

国际象棋中的皇后非常神勇,一个皇后可以控制横、竖、斜线等4个方向(或者说是8个方向),只要有棋子落入她的势力范围,则必死无疑,所以对方的每个棋子都要小心地躲开皇后的势力范围,选择一个合适的位置放置。如果在棋盘上有两个皇后,则新皇后控制的势力范围与第一个皇后控制的势力范围可以进行叠加,这样随着皇后数量的增加,皇后们控制的范围越来越大,直至控制了棋盘中全部的格子。

现在我们关心的是,如果在 N×N 的棋盘上放入 M 个皇后(M个皇后相互之间不能冲突)控制棋盘中的格子,则共有多少种不同的放置方法?

输入:N (N <= 10) M (M <= N)

输出:如果将 M 个皇后放入 N×N 的棋盘中可以控制全部棋盘中的格子,则不同的放置方法的数量

例:input 2 1 output 4
input 3 1 output 1

挺好玩的问题,

c++ #include<bits/stdc++.h> using namespace std; int n,m,ans,b[105],c[105],d[105],cnt; void dfs(int x){ if(cnt==m){ ans++; return; } if(x>n) return; for(int i=1;i<=n;i++){ if(!b[i]&&!c[i+x]&&!d[i-x+n]){ b[i]=c[i+x]=d[i-x+n]=1; cnt++; dfs(x+1); b[i]=c[i+x]=d[i-x+n]=0; cnt--; } } dfs(x+1); } int main(){ cin>>n>>m; dfs(1); cout<<ans<<endl; return 0; }写了试试

自己的作业自己写