穷举搜索:回溯与深搜



穷举搜索:回溯与深搜

计算机常用算法大致有两大类,一类叫蛮力算法,一类叫贪心算法,前者常使用的手段就是搜索,对全部解空间进行地毯式搜索,直到找到指定解或最优解。

【建立解空间】
问题的解应该如何描述,如何建立?借助图论的思想,我们可以用图来描述,图的定义为G<V,E>,由顶点集和边集构成,顶点即实实在在的数 据、对象,而边可以抽象为关系,即顶点间的关系,这种关系不一定非要在数据结构上表现出来,用数据结构的语言来描述,如果关系是一对一,则为线性表,如果 关系是一对多,则为树,如果关系是多对多,则为图,如果完全没有关系,则为集合。但在数据结构中这种关系不一定非要在数据的存[......]

Read more

C++ 数独游戏(回溯)



C++ 数独游戏(回溯)

数独游戏的规则:

1 每个数字在每一行只能出现一次

2 每个数字在每一列只能出现一次

3 每个数字在每一区只能出现一次

下面的input.txt是一个例子的约束条件 第一列表示每一个数所在的行 第二列表示每一个数所在的列,第三个这个位置上的值。

Input.txt

1 1 7

1 4 1

1 8 8

1 9 3

2 1 4

2 3 2

2 5 7

2 6 3

3 4 4

3 5 5

3 8 2

3 9 7

4 3 7

4 7 3

4 8 1[......]

Read more

回溯法求解数独(C++实现)

回溯法求解数独(C++实现)

回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
[cpp] view plaincopy
#include <iostream>
#include <algorithm>
using namespace std;
int map[9][9];
bool isPlace(int count){
int row = count / 9;
int c[......]

Read more

01背包问题—–回溯法的解决方案

01背包问题—–回溯法的解决方案01背包问题是个经典的动态规划问题,但是也可以用回溯法来解决。只是这是找一个子树而不是一个全部树元素的排列。

#include<iostream>
using namespace std;
#define MAX 1024
int C=7;//最大重量
int N=4;//包个数
int value[MAX];//记录每个包的价值
int weight[MAX];//记录每个包的重量
int currentValue=0;//当前的价值
int currentWeight=0;//当前的重量
int maxV[......]

Read more

全国信息学奥林匹克联赛(NOIP 2007)复赛题目

全国信息学奥林匹克联赛(NOIP 2007)复赛题目

NOIP2007第十三届全国青少年信息学奥林匹克联赛复赛试题普及组

 

普及组

 

 

题目一览

 

题目名称
奖学金
纪念品分组
守望者的逃离
Hanoi双塔问题

代号
scholar
group
escape
hanoi

输入文件
scholar.in
group.in
escape.in
hanoi.in

输出文件
scholar.out
group.out
escape.out[......]

Read more

struts.xml文件中主要配置元素的使用

struts.xml文件中主要配置元素的使用

struts.xml文件的配置:
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE struts PUBLIC
“-//Apache Software Foundation//DTD Struts Configuration 2.0//EN”
“http://struts.apache.org/dtds/struts-2.0.dtd”>
<struts>
<package name=”default” extends=”struts-defa[......]

Read more

c++快速排序(QuickSort)

快速排序(QuickSort)

划分的关键是要求出基准记录所在的位置pivotpos,编程时候的关键点

 

快速排序:

 

既然能把冒泡KO掉,马上就激起我们的兴趣,tnd快排咋这么快,一定要好好研究一下。

 

首先上图:    

 

 

 

从图中我们可以看到:

 

left指针,right指针,base参照数。

 

其实思想是蛮简单的,就是通过第一遍的遍历(让left和right指针重合)来找到数组的切割点。

&nb[......]

Read more

C++实现快速排序(源代码)

C++实现快速排序(源代码)

快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

快速排序是一种不稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动

快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。

该方法的基本思想是:

1.先从数列中取出一个数作为基准数。[......]

Read more

c++白话经典算法系列之六 快速排序 快速搞定如何理解

白话经典算法系列之六 快速排序 快速搞定快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想—-分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。

总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序作了下白话解释,希望对大家理解有帮助,达到快速排序,快速搞定

 

快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Div[......]

Read more