枚举
2015-08-09 18:02
183 查看
基于已有知识进行答案猜测的一种问题求解策略
从可能的集合中一一列举各元素
根据所知道的知识,给一个猜测的答案
枚举算法
对问题可能解集合的每一项
根据问题给定的检验条件判定哪些是成立的
使条件成立的即是问题的解
判断猜测的答案是否正确
进行新的猜测:有两个关键因素需要注意
1、猜测的结果必须是之前没出现过的
2、猜测过程要及早排除错误的答案
给出解空间,建立简洁的数学模型
减少搜索的空间
采用合适的搜索顺序
eg 1:小于N的最大素数
eg 2:熄灯问题
从可能的集合中一一列举各元素
根据所知道的知识,给一个猜测的答案
枚举算法
对问题可能解集合的每一项
根据问题给定的检验条件判定哪些是成立的
使条件成立的即是问题的解
判断猜测的答案是否正确
进行新的猜测:有两个关键因素需要注意
1、猜测的结果必须是之前没出现过的
2、猜测过程要及早排除错误的答案
给出解空间,建立简洁的数学模型
减少搜索的空间
采用合适的搜索顺序
eg 1:小于N的最大素数
#include <iostream> #include <stdio.h> #include <vector> using namespace std; //求小于N的最大素数 //最小的素数是2,之后的偶数不可能是素数,之后的素数不能被之前的素数整除 int main() { vector<int> vPrimeNumber; int n; int maxFactor; bool isPrimeNumber = true; while(cin>>n) { if(n < 2 ) break; if(n == 2) maxFactor = 2; vPrimeNumber.push_back(maxFactor); for(int i = 1;2*i +1 < n;i++) { for(int j= 0; i<vPrimeNumber.size();i++) { if((2*i+1)%vPrimeNumber[j] == 0) { isPrimeNumber = false; break; } } if(isPrimeNumber) { maxFactor = 2*i+1; vPrimeNumber.push_back(maxFactor); } } char temp[200]; sprintf(temp,"小于 %d 的最大素数为 %d \n",n,maxFactor); printf("%s",temp); } return 0; }
eg 2:熄灯问题
bool Guess() { for(int i = 1; i< 5 ;i++) { for(int j =1; j<7 ;j++) { PRESS[i+1][j] = (PUZZLE[i][j] + PRESS [i][j-1] + PRESS[i][j] + PRESS[i][j+1] + PRESS[i-1][j])%2 ; } } for(int i = 1;i<=6;i++) { if((PRESS[4][i] + PRESS[5][i-1]+PRESS[5][i]+PRESS[5][i+1])%2 != PUZZLE[5][i] ) return false; } return true; } void Enumerator() { 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; } int main() { for(int i=0;i<=7;i++) { PRESS[0][i] = 0; } for(int i=1 ;i<=5;i++ ) { PRESS[i][0]=PRESS[i][7] = 0; } int N; cin>>N; for(int i = 0; i<N;i++) { for(int j=1;j<=5;j++) { for (int k=1;k<=6;k++) { scanf("%d",&PUZZLE[j][k]); } } } Enumerator(); printf("-----------------------------\n"); for(int j =1 ;j<= 5;j++) { for (int k = 1; k <= 6;k++) { printf("%d ",PRESS[j][k]); } printf("\n"); } return 0; }
相关文章推荐
- zoj 3212 K-Nice 解题报告
- 最详细的Log4j使用教程
- Winform开发全套31个UI组件开源共享
- Win10系统的Microsoft Edge浏览器打开任一网页均未响应卡死的问题
- C中预编译详解
- 如何准备论文
- 【C】文件读写问题
- ACM草地上洒水需要的最少的喷泉数
- angular-fullstack test
- Sqlite、以及系统常用的几个服务
- httpClient断线重连机制
- MFS分布式存储
- Java学习笔记-------父进程监听,子进程接受连接的完整实例
- 【HDU 4819】Mosaic 二维线段树模板
- 如何使用osChina的git代码管理
- 关系型数据库种类
- 字体冰封
- Mybatis 源码系列 相关资料
- Js获取当前日期时间及其它操作
- 架构师首先是开发人员