n皇后问题

来源:互联网 发布:日语汉字注音软件 编辑:程序博客网 时间:2024/06/15 03:54

n皇后

在nXn格的国际象棋上摆放n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法?

八皇后问题

次数

#include<stdio.h>#include<math.h>int n,ans=0;int f[1000];int check(int x,int y){//判断是否矛盾int i,j;for(i=1;i<x;i++){if(f[i]==y || abs(x-i)==abs(y-f[i])){return 0;}}return 1;}int dfs(int i){//搜索,判断是否可以到第n行,回 溯法 int j;if(i==n+1){ans++;return 0;}for(j=1;j<=n;j++){if(check(i,j)==1){f[i]=j;dfs(i+1);}}}int main(){int i,j;scanf("%d",&n);dfs(1); printf("%d",ans);} 
输出棋盘

#include<stdio.h>#include<math.h>int n,ans=0;int f[1000];int check(int x,int y){//判断是否矛盾 int i,j;for(i=1;i<x;i++){if(f[i]==y || abs(x-i)==abs(y-f[i])){return 0;}}return 1;}void out(){//输出方案 printf("case %d\n",ans);int i,j;for(i=1;i<=n;i++){for(j=1;j<=n;j++){if(f[i]==j) printf("%d ",1);else printf("%d ",0);}printf("\n");}}int dfs(int i){int j;if(i==n+1){ans++;out();return 0;}for(j=1;j<=n;j++){if(check(i,j)==1){f[i]=j;dfs(i+1);//继续搜,判断是否可以到第n行 }}}int main(){int i,j;scanf("%d",&n);dfs(1); printf("%d",ans);} 

原创粉丝点击