搜索算法(DFS和BFS)

深度优先搜索(DFS)

题目:
有n件物品,每件物品的重量为w[i],价值为c[i]。现在需要选出若干物品放入一个容器为v的背包中,使得在选入背包的物品重量和不超过容量v的前提下,让背包中物品的价值之和最大,求最大价值。(1<=n<=20)
解题代码如下:

#include
const int maxn=30;
int n,v,maxValue=0;	//物品件数n,背包容量v,最大价值maxValue
int w[maxn],c[maxn];	//w[i]为每件物品的重量,c[i]为每件物品的价值
//DFS,index为当前处理的物品编号
//sumW和sumC分别为当前总重量和当前总价值
void DFS(int index,int sumW,int sumC){
	if(index==n){	//已经完成对n件物品的选择 
		if(sumW<=v&&sumC>maxValue)
			maxValue=sumC;	//不超过背包容量时更新最大价值maxValue 
		return;
	}
	DFS(index+1,sumW,sumC);		//不选第index件物品 
	DFS(index+1,sumW+w[index],sumC+c[index]); 	//选第index件物品 
} 
int main(){
	scanf("%d%d",&n,&v);
	for(int i=0;i

输入数据:
5 8
3 5 1 2 2
4 5 2 1 3
输出结果:
10

广度优先搜索(BFS)

给出一个m x n矩阵,矩阵中的元素为0或1。称位置(x,y)与其上下左右四个位置(x,y+1),(x,y-1),(x+1,y),(x-1,y)是相邻的。如果矩阵中有若干个1是相邻的(不必两两相邻),那么称这些1构成了一个“块”。求给定的矩阵中的“块”个数。
输入数据:
6 7
0 1 1 1 0 0 1
0 0 1 0 0 0 0
0 0 0 0 1 0 0
0 0 0 1 1 1 0
1 1 1 0 1 0 0
1 1 1 1 0 0 0
输出结果:
4
代码实现如下:

#include
#include 
#include
using namespace std;
const int maxn=100;
struct node{
	int x,y;	//位置(x,y) 
}Node; 
int n,m;
int matrix[maxn][maxn];
bool inq[maxn][maxn]={false};
int X[4]={0,0,1,-1};
int Y[4]={1,-1,0,0};
bool judge(int x,int y){	//判断坐标(x,y)是否需要访问 
	//越界返回false
	if(x>=n||x<0||y>=m||y<0)
		return false;
	//当前位置为0,或(x,y)已入队,返回false
	if(matrix[x][y]==0||inq[x][y]==true)
		return false;
	//以上都不满足
	return true; 
} 
//BFS函数访问位置(x,y)所在的块,将该块中所有"1"的inq都设置为true
void BFS(int x,int y){
	queue Q;		//定义队列
	Node.x=x,Node.y=y;		//当前结点坐标为(x,y) 
	Q.push(Node);		//将结点入队
	inq[x][y]=true;		//设置(x,y)已入过队
	while(!Q.empty()){
		node top=Q.front();		//取出队首元素 
		Q.pop();			//队首元素出队 
		for(int i=0;i<4;i++){
			int newX=top.x+X[i];
			int newY=top.y+Y[i];
			if(judge(newX,newY)){
				Node.x=newX,Node.y=newY;	//如果新位置(newX,newY)需要访问 
				Q.push(Node);			//结点Node加入队列 
				inq[newX][newY]=true; 		//设置位置(newX,newY)已入过队 
			} 
		}
	} 
} 
int main(){
	scanf("%d%d",&n,&m);
	for(int x=0;x

总结

DFS主要栈靠实现,例子中的递归实现本质上是利用系统对于递归所调用一个叫系统栈的东西来存放递归中的每一层状态。
BFS主要靠队列实现,队列先进先出的规律与栈截然相反。

你可能感兴趣的:(C/C++)