标签:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int n,m,goal; int ans,sum; void DFS(int row,int ld,int rd,int sum,int now) // //每一次调用,都根据row,ld,rd计算出可行位置pos。然后遍历pos的所有位置。ld<<1,rd>>1表示下一行。row+p,表示第p行已被占用 // (ld+p)<<1,(rd+p)>>1表示第p行被占用后,在下一行对角线位置的冲突情况。 { if (now>n) return; if (sum<m) { int pos=goal&(~(row|ld|rd));//所有可行位置 //printf("%d %d %d %d\n",pos,row,ld,rd); while (pos>0)//遍历该行所有的位置 { int p=pos&(-pos);//p是某一个可以放置的位置 ,其实就是右边的位 pos-=p; DFS(row+p,(ld+p)<<1,(rd+p)>>1,sum+1,now+1); } DFS(row,ld<<1,rd>>1,sum,now+1);//遍历下一行 } else ++ans; } int main() { scanf("%d%d",&n,&m);//n = 6,m = 4表示,在6×6棋盘上放置4个皇后 goal=(1<<n)-1;//goal表示一行中所有的位置。 //printf("%d\n",goal); DFS(0,0,0,0,0); printf("%d\n",ans); system("pause"); return 0; }
结果与分析:
详情见matrix67大牛的博客。
标签:
原文地址:http://www.cnblogs.com/aiqin/p/4410343.html