N皇后

来源:互联网 发布:淘宝象印官方旗舰店 编辑:程序博客网 时间:2024/04/27 10:35

题目大意:有一个N*N的棋盘,要在上面放N个皇后。为了不让她们互相攻击,每一竖列、横列、斜列,都只能有一个皇后。求有多少种摆法,并打出每一种摆法。(如果你想知道详细题目——去问度娘)

样例:

input:4

output :

0 1 0 00 0 0 11 0 0 00 0 1 00 0 1 01 0 0 00 0 0 10 1 0 02

分析:其实这道题很简单,就是一道DFS模板题。首先读入数据,然后DFS第一排枚举N个格子,再枚举第二排,直到第N排。每放一个皇后都要进行一次判断,是否与其它皇后冲突,直到放完N个皇后。好,废话不多说,下面我们来看代码(注意为了方便大家理解程序,这不一定是最简单的方法):

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>int f[20][20],ans,n;//判断是否可放皇后的函数 int kf(int x,int y){  int i=x,j=y;  while (i>0 && j>0){            //判断左上方有没有皇后     i--; j--;    if (f[i][j]) return 0;//一但找到皇后,就返回0  }  i=x; j=y;  while (i>0){                   //判断上方有没有皇后     i--;    if (f[i][j]) return 0;  }  i=x; j=y;  while (i>0 && j<=n){            //判断右上方有没有皇后     i--; j++;    if (f[i][j]) return 0;  }  return 1;}//输出函数 void out(){  int i,j;  for (i=1;i<=n;i++){    for (j=1;j<=n;j++)      printf("%d ",f[i][j]);//打出每一格的状态     puts("");  }  puts(""); ans++;//方案数加1 }//深搜函数 void dfs(int i){  int j;  for (j=1;j<=n;j++)//枚举每一个位置     if (kf(i,j)){f[i][j]=1;//"放皇后" if (i==n) out();//判断达标,输出 else dfs(i+1);//继续搜索 f[i][j]=0;//回朔     }}int main(){    scanf("%d",&n);    dfs(1); //从第1行开始摆皇后    printf("%d\n",ans);//搜完打出总方案数     system("pause>nul");    return 0;}


 

2 0
原创粉丝点击