回溯——n皇后问题
来源:互联网 发布:绿联hdmi网络传输器 编辑:程序博客网 时间:2024/06/05 04:34
问题描述:
在一个n*n的棋盘上放上n个皇后棋子,要求每个皇后之间不位于同一行、同一列、同一对角线;
思路:
我们知道每一行都存在一个皇后,用一个数组col[i]来存放第i行皇后的位置,这样就保证了皇后不会出现在在同一行上,要检查同一行,只需检查两个皇后对应的col是否相等;检查同一对角线,他们行数之差的绝对值等于列数之差的绝对值;
按行的顺序来找皇后的位置,依次考察一行中每列位置是否与之前的皇后构成威胁,若否则跳过,若是则进行下一行的考察;
代码实现:
import java.util.Scanner;//没有考虑棋盘对称的情况public class NQueens {int n,i=1;int[] col;//从第i个皇后开始放置NQueens(){System.out.print("请输入皇后数目");Scanner scan=new Scanner(System.in);n=scan.nextInt();col=new int[n+1];}//先确定每一行都有一个皇后,现在只需要确认每行的皇后在哪一行void queens(int i){if(promise(i)){if(i==n){printQueens();System.out.println();}elsefor(int j=1;j<=n;j++){col[i+1]=j;queens(i+1);}}}//用来判断第i行的queen是否受到其他皇后的威胁boolean promise(int i){int k=1;boolean flag=true;while(k<i&&flag){if(col[k]==col[i]||Math.abs(k-i)==Math.abs(col[k]-col[i]))//不同行的皇后,不能再同一行或同一对角线出现flag=false;k++;}return flag;}//打印皇后坐标void printQueens(){System.out.println("第"+i+++"种情况");for(int i=1;i<=n;i++)System.out.println("("+i+","+col[i]+")");}public static void main(String[] args){NQueens queens=new NQueens();queens.queens(0);}}
阅读全文
0 0
- 回溯——n皇后问题
- 回溯——n皇后问题 收藏
- n皇后问题——回溯算法
- N皇后问题——回溯算法
- 回溯——n皇后问题
- 回溯法经典—n-皇后问题
- 回溯算法—n皇后问题
- 回溯算法—n皇后问题
- 回溯算法—N皇后问题
- 回溯法—八皇后问题(N皇后)
- 回溯——N皇后
- 回溯:N皇后问题
- 回溯法———n皇后问题
- 回溯法求解 “n 皇后 问题”——Java 实现
- 006回溯法——n皇后问题
- 回溯法——求解N皇后问题
- 回溯法——八皇后问题 n-queens
- 【算法笔记】回溯法——n皇后问题
- 树
- 各版本数据库的默认端口号
- Stringbuffer与Stringbuilder源码学习和对比
- 海量数据处理问题
- Attribute和Property的区别
- 回溯——n皇后问题
- 哈希表冲突的解决
- 《Java程序性能优化》学习笔记 设计优化
- 关于锁的理解
- flume-架构
- 10.12周四
- 《Java程序性能优化》学习笔记 程序优化
- 数据结构实验之栈与队列十一:refresh的停车场
- Linux上安装pycharm