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
- n皇后
- N皇后
- N 皇后
- n皇后
- n皇后
- N皇后
- N皇后
- n皇后
- n 皇后
- N皇后
- N皇后
- N皇后
- N皇后
- n皇后
- N皇后
- N皇后
- N皇后
- N皇后
- 今日的第一个博客
- 数据结构基础之链表
- 求能覆盖到所有点的最少集合情况(超时题,须优化)
- HDU 4518 解题报告
- 【DP】Codeforces Round #341 (Div. 2) E
- N皇后
- 关于getline
- 走过2015,展望2016
- 安卓开发——DisplayMetrics类
- FZUOJ 1402 猪的安家 (中国剩余定理 互质)
- 每个痛苦的过程都是你进步的阶梯
- HDU 2647 Reward(拓扑排序)
- 初来乍到,发博一篇,关于Fortran和Matlab
- 331. Verify Preorder Serialization of a Binary Tree