n皇后问题<dfs>
n皇后问题指的是: n*n的国际象棋棋盘上摆放n个皇后,使其不能互相攻击, 即任意两个皇后都不能处于同一行、同一列或同一斜线上, 问有多少种摆法。 和一般n皇后问题不同的是,现在棋盘上有可能已经放了一个皇后了。 你能求出有多少合法的方案吗?
多组数据。 第一行有两个数n和m,n<=13表示棋盘大小,m<=1表示棋盘上已经有m个皇后了。 下面m行,每一行有两个数x、y(x,y< n)表示棋盘上x行y列已经有一个皇后了。
思路:打表,然后参考紫书。
#include<iostream> #include<cstdio> #include<cstring> int a[14]={0,1,0,0,2,10,4,40,92,352,724,2680,14200,73712};//打表了哈 int vis[3][30]; int n,m,x,y,ans; using namespace std; void dfs(int cur) { if(cur==n){ans++;return;} else if(cur==x) dfs(cur+1); else for(int i=0;i<n;i++) { if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n]) { vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1; dfs(cur+1); vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0; } } } int main () { while(~scanf("%d%d",&n,&m)){ ans=0; memset(vis,0,sizeof(vis)); if(!m)//打表 printf("%d\n",a[n]); else{ scanf("%d%d",&x,&y); vis[0][y]=vis[1][x+y]=vis[2][x-y+n]=1;//x代表行,y代表列 dfs(0); printf("%d\n",ans); } } return 0; }
想的太多,做的太少。