搜索算法(DFS和BFS)

深度优先搜索(DFS)

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

#include<cstdio>
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<n;i++) 
		scanf("%d",&w[i]);	//每件物品的重量 
	for(int i=0;i<n;i++)
		scanf("%d",&c[i]);	//每件物品的价值 
	DFS(0,0,0);			//初始时为第0件物品,当前总重量和总价值均为0 
	printf("%d\n",maxValue);
	return 0;
} 

输入数据:
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<iostream>
#include<queue> 
#include<algorithm>
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<node> 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<n;x++){
		for(int y=0;y<m;y++){
			scanf("%d",&matrix[x][y]);
		}
	}
	int ans=0;		//存放块数 
	for(int x=0;x<n;x++){		//枚举每个位置 
		for(int y=0;y<m;y++){
			//如果元素为1,且未入过队
			if(matrix[x][y]==1&&inq[x][y]==false){
				ans++;
				BFS(x,y);	//访问整个块,将该块所以"1"的inq都标记为true 
			} 
		}
	}
	printf("%d\n",ans);
	return 0; 
}

总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值