美文网首页
001-枚举问题

001-枚举问题

作者: 有态度的我 | 来源:发表于2020-03-10 21:14 被阅读0次

1.求一个小于N 的最大素数

N- k 是素数的充分必要条件:

                                    N- K 不能被任何一个大于1, 小于N-K 的素数整除

问题的转换

                            N-K 是否是素数 ----> 小于N-K 的全部素数

枚举解决办法:

      2  是素数 ,记为 P0

        根据 p0,p1...pk ,寻找比pk大的最小素数p(k+1)

        如果p(k+1) 大于N, 则PK 是我们需要找的素数 ,否则, 继续寻找

枚举的本质: 从可能的集合中一一列举各元素。

枚举算法:

对问题可能解集合 的每一项

                        根据问题给定的检验条件判定哪些是成立的

                        使条件成立的既是问题的解

枚举的过程:

- 判断猜测的答案是否正确

---》 2是小于N的最大素数吗?

- 进行新的猜测:!!有两个重要的注意因素

                    -  猜测的结果必须是前面的猜测中没有出现过的, 每次猜测是素数,一定比已经找到的素数大

                  - 猜测的过程中要及早排除错误的答案 , 除2以外, 只有奇数才有可能是素数。

### 熄灯问题

1. 问题描述

- 有一个由按钮组成的矩阵, 其中每行有6个按钮,共5行,

- 每个按钮的位置上有一盏灯

- 每按下一个按钮后, 该按钮以及周围的灯会改变一次

- 状态: 熄灭/ 点亮

- !!特殊情况:

                      -在矩阵角上的按钮改变3盏灯、

                      - 矩阵边上的按钮改变4盏灯

                      - 其他的按钮改变5盏灯

2.题目分析

- 第2次按下同一个按钮时,将抵消第1次按下时产生的结果

- --》 每个按钮最多只需要按一下

-  每个按钮被按下的顺序对最终的结果没影响

- 对第1行中每盏点亮的灯,按下第二行对应的按钮, 就可以熄灭第1行的全部灯

--- 第一种想法:

### 枚举所有可能的按钮状态, 对每个状态计算一下最后灯的情况, 看是否都熄灭

- 每个按钮:0/1

- 一共有30个开关, 状态数时2^30 ,会超时

------------------------

如何减少枚举的状态数目?

如果存在某个局部, 一旦这个局部的状态被确定, 那么剩余其他部分的状态只能是确定的一种, 或者不多的n种, 那么只需枚举这个布局的状态即可.

** 第一行是这样一个“局部”

- 因为第一行的各开关状态确定的情况下, 这些开关作用过后, 将导致第一行某些灯是亮着的

- 要熄灭第一行某个亮着的灯, 那么唯一的办法就是按下第二行的灯

--》 为了使第一行的灯全部熄灭,第二行的合理开关状态就是唯一的

--》 第二行开关起作用后, 第三行的开关状态也是唯一的

--》 最后一张的开关也是唯一的

### 只要第一行的状态定下来,定为A 那么剩余行的情况就是确定唯一的

因此, 要推算的是:

最后一行的所有灯起作用后, 最后一行的灯是否都熄灭,

- 如果是, 那么A是一个解的状态

- 如果不是, 那么A 不是解的状态, 第1行换个状态重新尝试

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200310201818998.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjkxOTY1Nw==,size_16,color_FFFFFF,t_70)

2. 将按钮矩阵的第一行的每个取值看作是一个二进制数

3. 通过实现++ 操作实现

```

press[r+1][c] = (puzzle[r][c] + press[r][c-1] + press[r][c] + press[r][c+1] + press[r-1][c]) % 2;

```

````

#include <stdio.h>

int puzzle[6][8], press[6][8];

bool guess(){

int c,r;

for(r= 1; r< 5; r++)

for(c = 1; c<7; c++)

press[r+1][c] = (puzzle[r][c] + press[r][c-1] + press[r][c] + press[r][c+1] + press[r-1][c]) % 2;

for(c= 1; c<7; c++)

if((press[5][c-1] + press[5][c] + press[5][c+1] + press[4][c] % 2 != puzzle[5][c])// (1,1)⇒ 0, (0,0)⇒ 0

return false;

return true;

}

```

```

void enumerate()

{

int c;

bool success;

for(c = 1; c<7; c++)

press[1][c] = 0;

while (guess() == false){

press[1][1] ++;

c = 1;

//进位操作

while (press[1][c] > 1){

press[1][c] = 0;

c++;

press[1][c] ++;

}

}

return ;

}

```

相关文章

  • 001-枚举问题

    1.求一个小于N 的最大素数 N- k 是素数的充分必要条件: N- K 不...

  • 001-枚举问题---讨厌的青蛙

    问题描述: 。 在韩国, 有一种青蛙 。 每到晚上,这种青蛙会跳跃稻田,从而踩踏稻子 。 农民早上看到被踩踏的...

  • 《设计模式之禅》读书笔记-2.6-代理模式

    2.6 代理模式 代理的原理可先参看此文章:Java基础-001-枚举、反射、类加载器、内省、注解、泛型、代理 定...

  • dfs-lc17&bfs-116

    [TOC] 图的三种算法伪代码: dfs: 会枚举完所有完整的路径。【很多递归问题、子集问题、枚举问题等】 之前的...

  • iOS位移枚举

    位移枚举 目录 问题引入 问题解析 概念讲解 问题解决办法(位移枚举) 优化方法 问题引入 假定有一项考试,考试内...

  • enum class

    强类型枚举 枚举:分门别类与数值的名字 允许匿名枚举的出现容易出现以下问题: C语言中枚举是 常量数值的 别名,因...

  • java 枚举循环依赖时初始化问题

    今天遇到一个问题,就是设计了两个枚举,一个是状态枚举(EnumA)一个是动作枚举(EnumB),状态枚举定义了当前...

  • java enum 枚举比较 == or equals ??

    问题 枚举比较报错 NPE 在使用枚举比较时,使用了equals来比较两个枚举值 结果空指针了 解决方案 1、还是...

  • Android枚举字段序列化

    实体类实现Parcelable接口后枚举字段该怎么写?正好碰到这个问题,记录一下。 枚举类 枚举字段序列化,这里直...

  • 枚举之熄灯问题

    问题描述 输入 输出 样例 解题分析 有没有状态数更少的做法? 具体实现 实现方案 程序实现 按行枚举 按列枚举 ...

网友评论

      本文标题:001-枚举问题

      本文链接:https://www.haomeiwen.com/subject/esfndhtx.html