算法Day2——回溯法笔记

回溯法

回溯法(图源小码哥)
可以使用位运算压缩空间。如我之前的博客在解决N皇后问题时,使用Byte和short类型存储列和斜线的状态:回溯法之N皇后的三种解法

位运算知识:

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.基本类型的存储范围 最大值和最小值。

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

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

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

  4. 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以前是什么现在还是什么
如N皇后问题

for(int i=0;i<8;i++) {
			//row行的i列尝试放置皇后
			queens[row]=i;
			//判断该列 对角线是否为1 按位与1作与运算
			//如要知道第二列要没有放置皇后
			//cols:01100001
			//cv:&	00000100
		//cols&cv		 0
			int cv= 1<<i;
			if(( cols & cv )!=0 ) continue ;
			
			int lv=1<< (row-i+7);
			if((leftTop & lv)!=0 )continue ;
			
			int rv=1<< (row+i);
			if((rightTop & rv)!=0) continue;
			//将该列 对角线置为1
			//如将第二列置为皇后
			//cols:01100001
			//cv:	00000100
		//cols|cv		 1
			
			cols |=cv;
			leftTop |=lv;
			rightTop |=rv;
			place(row+1);
			//将该列 对角线重置为0		~表示取反
			//cols:01100101
			//cv:	00000100
			//~cv:	11111011
		//~cv&cols: 01100001	
			cols &= ~cv;
			leftTop &= ~lv;
			rightTop &= ~rv;
			
		}
发布了9 篇原创文章 · 获赞 0 · 访问量 155

猜你喜欢

转载自blog.csdn.net/weixin_44855907/article/details/104591316