N皇后

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

样例:

input:4

output :

0 1 0 0
0 0 0 1
1 0 0 0
0 0 1 0

0 0 1 0
1 0 0 0
0 0 0 1
0 1 0 0

2

分析:其实这道题很简单,就是一道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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值