B - N皇后问题
张老板把这个艰巨的任务交给了你,对于给定的N,求出有多少种合法的放置方法。
Input共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。Output共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。Sample Input
1
8
5
0
Sample Output
1
92
10
第一次看到这个题感觉很难,后来通过看视频学会了一种递归算法来解这道问题,想明白后还是很有意思的,不过递归是一种很低效的算法,提交的时候TEL了,正确的解法应该是用回溯算法,以后有时间再理解
递归算法(低效)
#include<stdio.h>
#include<string.h> int count = ;
int t; int notDanger(int row, int j, int (*arr)[])
{
int flag1, flag2, flag3, flag4, flag5;
int i, k; flag1 = flag2 = flag3 = flag4 = flag5 = ; //判断列是不是危险
for( i = ; i < t; i++ )
{
if(arr[i][j] == )
{
flag1 = ;
break;
}
} //判断左上方
for( i = row, k = j; i >= && k >= ; i--, k-- )
{
if(arr[i][k] == )
{
flag2 = ;
break;
}
} //判断左下方
for( i = row, k = j; i < t && k >= ; i++, k-- )
{
if(arr[i][k] == )
{
flag3 = ;
break;
}
} //判断右上方
for( i = row, k = j; i >= && k < t; i--, k++ )
{
if(arr[i][k] == )
{
flag4 = ;
break;
}
} //判断右下方
for( i = row, k = j; i < t && k < t; i++, k++ )
{
if(arr[i][k] == )
{
flag5 = ;
break;
}
} if(flag1 == || flag2 == || flag3 == || flag4 == || flag5 == )
return ; else
return ;
} void nQueen(int row, int n, int (*arr)[])
{
int arr2[][], i, j; for( i = ; i < n; i++ )
{
for( j = ; j < n; j++ )
{
arr2[i][j] = arr[i][j];
}
} if(row == n)
count++; else
{
//该位置没有危险
for( j = ; j < n; j++ ) //这一部分代码其实往下会产生很大的容量
{ //有时候自己会在这部分,搞混。
if(notDanger(row, j, arr))
{
for( i = ; i < n; i++ )
{
arr2[row][i] = ;
} arr2[row][j] = ; nQueen(row+, n, arr2);
}
}
}
} int main()
{
int arr[][], i, j; while(scanf("%d", &t) != EOF && t)
{
count = ; for( i = ; i < t; i++ )
{
for( j = ; j < t; j++ )
{
arr[i][j] = ;
}
} nQueen(, t, arr);
if(count == )
printf("None\n");
else
printf("%d\n", count);
} return ;
}
回溯算法
#include<stdio.h>
#include<string.h> int n,tmp;
int map[]; void DFS(int k)
{
int i,j,flag;
if(k==n+)
{
tmp++;
return;
}
else
{
for(i=;i<=n;++i)
{
map[k]=i;
flag=;
for(j=;j<k;++j)
{
if(map[j]==i||i-k==map[j]-j||i+k==map[j]+j) // 注:1、i=map[k] 2、不在同一条斜线的两点的含义是行标到对角线的的距离不相等
{
flag=;
break;
}
}
if(flag)
DFS(k+);
}
}
} int main()
{
int i,m;
int ans[];
for(n=;n<=;++n)
{
tmp=;
DFS();
ans[n]=tmp;
}
while(scanf("%d",&m),m)
{
printf("%d\n",ans[m]);
}
return ;
}
B - N皇后问题的更多相关文章
- 递归实现n(经典的8皇后问题)皇后的问题
问题描述:八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后, 使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上 ...
- 八皇后算法的另一种实现(c#版本)
八皇后: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于 ...
- [LeetCode] N-Queens II N皇后问题之二
Follow up for N-Queens problem. Now, instead outputting board configurations, return the total numbe ...
- [LeetCode] N-Queens N皇后问题
The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...
- N皇后问题—初级回溯
N皇后问题,最基础的回溯问题之一,题意简单N*N的正方形格子上放置N个皇后,任意两个皇后不能出现在同一条直线或者斜线上,求不同N对应的解. 提要:N>13时,数量庞大,初级回溯只能保证在N< ...
- 数据结构0103汉诺塔&八皇后
主要是从汉诺塔及八皇后问题体会递归算法. 汉诺塔: #include <stdio.h> void move(int n, char x,char y, char z){ if(1==n) ...
- N皇后问题
题目描述 在n×n格的棋盘上放置彼此不受攻击的n个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于再n×n的棋盘上放置n个后,任何2个皇后不妨在同一行或同 ...
- LeetCode:N-Queens I II(n皇后问题)
N-Queens The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no tw ...
- 八皇后问题_Qt_界面程序实现
//核心代码如下 //Queen--放置皇后 #include "queue.h" queue::queue() { *; ; this->board = new bool[ ...
- 两个NOI题目的启迪8皇后和算24
论出于什么原因和目的,学习C++已经有一个星期左右,从开始就在做NOI的题目,到现在也没有正式的看<Primer C++>,不过还是受益良多,毕竟C++是一种”低级的高级语言“,而且NOI ...
随机推荐
- FPGA SD 卡 之 乒乓操作 、同步fifo
这里记录一个实际的需要使用乒乓操作的例子:读sd卡数据的时,在spi的模式下.发送单数据块的读取命令,在回应之后会有 512字节的数据.使用乒乓操作,可以用两个八位的寄存器,就可以完成连续的512字节 ...
- springboot成神之——发送邮件
本文介绍如何用spring发送邮件 目录结构 依赖 MailConfig TestController 测试 本文介绍如何用spring发送邮件 目录结构 依赖 <dependency> ...
- Android UI学习 - ListView (android.R.layout.simple_list_item_1是个什么东西)
Android UI学习 - ListView -- :: 标签:Android UI 移动开发 ListView ListActivity 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始 ...
- Hive split 分割函数
hive字符串分割函数 split(str, regex) - Splits str around occurances that match regexTime taken: 0.769 secon ...
- Class.forName和ClassLoader.loadClass区别(转)
Java中class是如何加载到JVM中的:1.class加载到JVM中有三个步骤 装载:(loading)找到class对应的字节码文件. 连接:(linking)将对应的字节码文件读入 ...
- Scala语言简介和开发环境配置
Scala语言的简介和开发环境搭建 Scala是一门结合了面向对象特征和函数式编程特征的语言,它是一个创新的编程语言产品.Scala可以做脚本(就像shell脚本一样),可以做服务端编程语言,可以写数 ...
- mysql视图总结
http://www.2cto.com/database/201508/427083.html 一. 视图概述 视图是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据. ...
- wampserver无法打开http://127.0.0.1/
如果你更换了端口号那么你就应该把相应的端口号也带上,比如localhost:8080(或127.0.0.1:8080)这样应该就可以了,因为只有80端口是默认才不用输入的.
- 20-取石子动态规则(hdu2516 斐波那契博弈)
http://acm.hdu.edu.cn/showproblem.php?pid=2516 取石子游戏 Time Limit: 2000/1000 MS (Java/Others) Memor ...
- scala _ parameter
Given that sequence, use reduceLeft to determine different properties about the collection. The foll ...