N皇后问题
来源:互联网 发布:家用网络交换机的作用 编辑:程序博客网 时间:2024/06/11 20:33
题目:
请设计一种算法,解决著名的n皇后问题。这里的n皇后问题指在一个nxn的棋盘上放置n个棋子,使得每行每列和每条对角线上都只有一个棋子,求其摆放的方法数。给定一个int n,请返回方法数,保证n小于等于15
测试样例:1 返回:1
最初的想法是构造一个二维数组的数据结构,然后穷举所有可能的情况,按照这个思路写了一坨东西,最后实在是不忍直视,于是参照网上的一些思路,自己实现了一下。
首先,并不是采用二维数组这种数据结构,而是采用了一维数组的方式,构造一个position数组,代表棋盘上的一行,比如position[i],代表第i行,postion[i]列,随后先固定一行,接着对列进行试探,
伪代码如下:
void queen(int row) { if (n == row) //如果已经找到结果,则打印结果 print_result(); else { for (k=0 to N) { //试探第row行每一个列 if (can_place(row, k) { place(row, k); //放置皇后 queen(row + 1); //继续探测下一行 } } } }
下面是具体的实现代码;
public class Queues { public int nQueens(int n) { // write code here if (n<=0){ return -1; } int[] position=new int[n];//position[i]表示第i行皇后的列号 return place(position,0,n); } private int place(int[] position, int i, int n) { if (i==n){ return 1; } int count=0; for(int j=0;j<n;j++){ if(isvalid(position,i,j)){//如果当前的位置是有效的 position[i]=j; count+=place(position,i+1,n);//往下挪一行 } } return count; } private boolean isvalid(int[] position, int i, int j) { for(int k=0;k<i;k++){//因为是对当前的位置进行判断,所以要对前面的i行数据进行校验 if ((j==position[k])||(Math.abs(position[k]-j)==Math.abs(i-k))){//如果同在一个列 return false; } } return true; }}
阅读全文
0 0
- N*N皇后问题
- 八皇后 n皇后 问题
- 八皇后N皇后问题
- N皇后问题
- n皇后问题
- N皇后问题
- N 皇后问题
- N皇后问题
- N皇后问题算法
- N 皇后问题
- N皇后问题
- N皇后问题
- n皇后问题
- N皇后问题
- N皇后问题优化
- N皇后问题
- n皇后问题
- N皇后问题
- HRBUST 2331 Great Atm 尚学堂杯"哈尔滨理工大学第七届程序设计竞赛
- hdu 2028 && 1019 (最小公倍数的几种求法)
- 断言(ASSERT)的用法
- 第七届蓝桥杯决赛JavaA组第六题_生成树计数
- JAVA中不同集合的理解
- N皇后问题
- Unity JsonToDic
- 1.#QNAN、1.#IND和1.#INF等“无效”浮点数说明及其判断
- JSON介绍
- 寻找最大数
- Smack jar包介绍
- libevent例子:time-test.c
- 新员工入职详细培训计划
- H