首页 > 搜索 > 三位数乘三位数算法图例,算法Day3:回溯法——N皇后问题

三位数乘三位数算法图例,算法Day3:回溯法——N皇后问题

互联网 2020-10-29 12:40:50
在线算命,八字测算命理

蓝桥杯算法合集: 蓝桥杯算法合集(终极完结版)

算法Day3:回溯法 回溯法位运算知识:N皇后解法一:暴力法解法二:回溯+剪枝解法三:回溯+剪枝+位运算

回溯法

思想 回溯法是一种择优搜索法。也叫试探法,按择优条件向前搜索,以达到目标。当探索到某一步时,发现原来现则并不优或者被强行return,就退回一步重新选择。这种走不通就退回再走的方法就称作回溯法。通常于递归搭配在一起使用。

例如 在这里插入图片描述 例如 当从B到走到D这状态不满足目标时,就退回一步回溯到B走下一个没有尝试的状态E(通常是外层循环来驱动的),这一过程就叫回溯。

应用 树、图的深度优先搜索

可以使用位运算压缩空间。如解决N皇后问题时,使用Byte和short类型存储列和斜线的状态.

位运算知识:

1. 基本类型的位数

一个字节等于8位1byte = 8bit。

char占用的是2个字节 16位,所以一个char类型的可以存储一个汉字。

整型:

byte:1个字节 8位short :2个字节 16位int :4个字节 32位long:8个字节 64位

浮点型:

float:4个字节 32 位double :8个字节 64位注:默认的是double类型,如3.14是double类型的,加后缀F(3.14F)则为float类型的。

char类型:

char:2个字节。

Boolean 类型

boolean: (true or false)(并未指明是多少字节1字节1位 4字节)

2.基本类型的存储范围 最大值和最小值。

short(10^5) 最小值:Short.MIN_VALUE=-32768 (-2的15次方) 最大值:Short.MAX_VALUE=32767 (2的15次方-1)

int(10^10) 最小值:Integer.MIN_VALUE= -2147483648 (-2的31次方) 最大值:Integer.MAX_VALUE= 2147483647 (2的31次方-1)

long(10^19) 最小值:Long.MIN_VALUE=-9223372036854775808 (-2的63次方) 最大值:Long.MAX_VALUE=9223372036854775807 (2的63次方-1)

float(10^38) 最小值:Float.MIN_VALUE=1.4E-45 (2的-149次方) 最大值:Float.MAX_VALUE=3.4028235E38 (2的128次方-1)

5.double(10^30) 最小值:Double.MIN_VALUE=4.9E-324 (2的-1074次方) 最大值:Double.MAX_VALUE=1.7976931348623157E30

位运算

*想知道A某一位是1还是0 只需和该位为1其他位为0的数按位与即可 将A某一位 置为1 只需和该位为1其他位为0的数按位或 将A某一位 置为0 只需和该位为0其他位为1的数按位与 a跟1与 a以前是什么现在还是什么 a跟0或 a以前是什么现在还是什么 部分代码如下

for(int i=0;iint ways;/* * cols数组 索引为皇后行号 值为改行皇后放置的位置 */int[]cols;void placeQueens(int n) {//判掉不合法的if(nways++;show();return;}for(int col=0;col//如果该行该列没有放置过皇后//第row行的皇后放在col列cols[row]=col;//开始摆放下一行place(row+1);//回溯 由于是用整型数组标记某一行的皇后放在某一列 //故改值会被另一个列的摆法的覆盖 无需修改}}}public boolean isValid(int row, int col) {for(int i=0;ifor(int i=0;iif(cols[i]==j) {System.out.print("1 ");}else {System.out.print("0 ");}}System.out.println();}System.out.println("-------------");}public static void main(String[] args) {new N皇后_整型数组标记().placeQueens(4);}} 解法二:回溯+剪枝 package 回溯;import java.util.Scanner;public class N皇后_布尔数组 {intways;/*cols数组标记某一列有没有放过皇后 * leftTop为自左上角到右下角的斜线n行有2*n-1条 * rightTop为自右上角到左下角的斜线n行有2*n-1条 * */boolean[]cols;boolean[]leftTop;boolean[]rightTop;void placeQueens(int n) {if(nways++;return;}for(int col=0;colScanner reader=new Scanner(System.in);new N皇后_布尔数组().placeQueens(4);}} 解法三:回溯+剪枝+位运算 package 回溯;public class N皇后_位运算 {/*用8位的Byte和16位的数据类型存放01状态表示棋盘的摆放状况 * */int [] queens;byte cols;short leftTop;short rightTop;int ans;void Equeens() {queens=new int[8];place(0);}void place(int row) {System.out.println(row);if(row==8) {ans++;return;}for(int i=0;inew N皇后_位运算().Equeens();}}

对比解法一和二,可以看到使用布尔数组标记后,如果要求得所有解或者是最优解,回溯部分代码需要将标记取消。而使用整型数组则不用。 下面通过四皇后走法图例来进入一步了解回溯法 在这里插入图片描述

免责声明:非本网注明原创的信息,皆为程序自动获取互联网,目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责;如此页面有侵犯到您的权益,请给站长发送邮件,并提供相关证明(版权证明、身份证正反面、侵权链接),站长将在收到邮件12小时内删除。

相关阅读

一周热门

查看更多