dfsN皇后问题
Posted 迪迪菜园
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dfsN皇后问题相关的知识,希望对你有一定的参考价值。
标题:N皇后问题
在N*N格的国际象棋上摆放N个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
方法一:
#include<iostream> #include<stdio.h> #include<math.h> #include<algorithm> int ans = 0,x,n; int a[10]={0},v[10]={1}; void judge() { for(int i = 1;i<=n;i++) { for(int j=1;j<i;j++) { if(abs(j-i) == abs(a[j]-a[i])) return; } } ans++; } void dfs(int x) { if(x>n) { judge(); return; } for(int i=1;i <= n; i++) { if(v[i]) { v[i] = 0; a[x] = 1; dfs(x+1); v[i] = 1; } } } int main() { scanf("%d",&n); dfs(1); printf("%d\n",ans); return 0; }
这个方法是将所有的数字排列成一行,然后i表示行,a[i](里面的j)表示列。
方法二:
#include <iostream> #include<cstdio> using namespace std; int a[10][10] = {0},v[10] ={0},w[10] = {0}; int ans = 0, n; void judge() { for(int i = 1; i < n; i++) { int k = i; int j = 1; int flag = 0; while(k <= n) { if(a[k][j] == 1) { flag++; } k++; j++; } if(flag > 1) return; } for(int i = 1; i < n; i++) { int k = i; int j = 1; int flag = 0; while(k <= n) { if(a[j][k] == 1) { flag++; } k++; j++; } if(flag > 1) return; } for(int i = n; i > 1; i--) { int k = i; int j = 1; int flag = 0; while(k >= 1) { if(a[k][j] == 1) { flag++; } k--; j++; } if(flag > 1) return; } for(int i = n; i > 1; i--) { int k = i; int j = n; int flag = 0; while(k <= n) { if(a[k][j] == 1) { flag++; } k++; j--; } if(flag > 1) return; } ans++; } void dfs(int x) { if(x == (n + 1)) { judge(); return; } for(int i = 1;i <= n;i++) { for(int j = 1;j <= n;j++) { if(!a[i][j] && !v[i] && !w[j]) { v[i] = 1; w[j] = 1; a[i][j] = 1; dfs(x + 1); a[i][j] = 0; v[i] = 0; w[j] = 0; } } } } int f(int t) { for(int i = 1; i < n; i++) { t *= i; } return t; } int main() { scanf("%d",&n); dfs(1); cout << ans / f(n); return 0; }
这个方法不太推荐,比较麻烦。
以上是关于dfsN皇后问题的主要内容,如果未能解决你的问题,请参考以下文章