Day 43 算法笔记之提高篇(2) 搜索专题

目录

一.深度优先搜索

1.选物品(最笨的写法)

2.剪枝

3.选数

4.Integer Factorization

二.广度优先搜索

1.BFS迷宫

2.Acute Stroke


一.深度优先搜索

1.选物品(最笨的写法)

#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#include<algorithm>
using namespace std;

const int maxn=30;
int n,v,maxvalue=0;
int w[maxn],c[maxn];

void dfs(int index,int sumw,int sumc){
	if(index==n){
		if(sumw<=v&&sumc>maxvalue){
			maxvalue=sumc;
		}
		return;
	}
	dfs(index+1,sumw,sumc);
	dfs(index+1,sumw+w[index],sumc+c[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);
	printf("%d\n",maxvalue);
	
	return 0;
}

2.剪枝

int ans=0;
void dfs_better(int index,int sumw,int sumc){
	if(index==n){
		return;
	}
	dfs(index+1,sumw,sumc);
	if(sumw+w[index]<=v){
		if(sumc+c[index]>ans){
			ans=sumc+c[index];
		}
		dfs(index+1,sumw+w[index],sumc+c[index]);
	}
}

3.选数

int n,k,x,maxsumsqu=-1,a[maxn];
vector<int> temp,ans;

void dfs(int index,int nowk,int sum,int sumsqu){
	if(nowk==k&&sum==x){
		if(sumsqu>maxsumsqu){
			maxsumsqu=sumsqu;
			ans=temp;
		}
		return;
	}
	if(index==n||nowk>k||sum>x) return;
	
	temp.push_back(A[index]);
	dfs(index+1,nowk+1,sum+a[index],sumsqu+a[index]*a[index]);
	temp.pop_back();
	dfs(index+1,nowk,sum,sumsqu);
}

4.Integer Factorization

#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;

int n,k,p,maxfacsum=-1;

vector<int> fac,ans,temp;

int power(int x){
	int ans=1;
	for(int i=0;i<p;i++){
		ans*=x;
	}
	return ans;
}

void init(){
	int i=0,temp=0;
	while(temp<=n){
		fac.push_back(temp);
		temp=power(++i);
	}
}

void dfs(int index,int nowk,int sums,int facsum){
	if(sums==n&&nowk==k){
		if(facsum>maxfacsum){
			ans=temp;
			maxfacsum=facsum;
		}
		return;
	}
	if(sums>n||nowk>k) return;
	if(index>0){
		temp.push_back(index);
		dfs(index,nowk+1,sums+fac[index],facsum+index);
		temp.pop_back();
		dfs(index-1,nowk,sums,facsum);
	}
}



int main(){
	scanf("%d%d%d",&n,&k,&p);
	init();
	dfs(fac.size()-1,0,0,0);
	if(maxfacsum==-1) printf("Impossible\n");
	else{
		printf("%d = %d^%d",n,ans[0],p);
		for(int i=1;i<ans.size();i++){
			printf(" + %d^%d",ans[i],p);
		}
	}
	
	return 0;
}

二.广度优先搜索

1.BFS迷宫

#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;

const int maxn=100;
struct nodes{
	int x,y;
	int step;
}s,t,node;

int n,m;
char maze[maxn][maxn];
bool inq[maxn][maxn] = {false};
int x[4] ={0,0,1,-1};
int y[4] = {1,-1,0,0};

bool test(int x,int y){
	if(x>=n||x<0||y>=m||y<0) return false;
	if(maze[x][y]='*') return false;
	if(inq[x][y]==true) return false;
	return true;
}

int bfs(){
	queue<nodes> q;
	q.push(s);
	while(!q.empty()){
		nodes top=q.front();
		q.pop();
		if(top.x==t.x&&top.y==t.y){
			return top.step;
		}
		for(int i=0;i<4;i++){
			int newx=top.x+x[i];
			int newy=top.y+y[i];
			if(test(newx,newy)){
				node.x=newx,node.y=newy;
				node.step=top.step+1;
				q.push(node);
				inq[newx][newy] = true;
			}
		}
	}
	return -1;
}

int main(){
	
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++){
		getchar();
		for(int j=0;j<m;j++){
			maze[i][j]=getchar();
		}
		maze[i][m+1] ='\0';
	}
	
	scanf("%d%d%d%d",&s.x,&s.y,&t.x,&t.y);
	s.step=0;
	printf("%d\n",bfs());
	return 0;
}

 2.Acute Stroke

#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;

struct nodes{
	int x,y,z;
}node;

int n,m,slice,t;
int pixel[1290][130][61];
bool inq[1290][130][61] ={false};
int xs[6] ={0,0,0,0,1,-1};
int ys[6] ={0,0,1,-1,0,0};
int zs[6] ={1,-1,0,0,0,0};

bool judge(int x,int y,int z){
	if(x>=n||x<0||y>=m||y<0||z>=slice||z<0) return false;
	if(pixel[x][y][z]==0||inq[x][y][z]==true) return false;
	return true;
}

int bfs(int x,int y,int z){
	int tot=0;
	queue<nodes> q;
	node.x=x,node.y=y,node.z=z;
	q.push(node);
	inq[x][y][z] = true;
	while(!q.empty()){
		nodes top=q.front();
		q.pop();
		tot++;
		for(int i=0;i<6;i++){
			int newx=top.x+xs[i];
			int newy=top.y+ys[i];
			int newz=top.z+zs[i];
			if(judge(newx,newy,newz)){
				node.x=newx,node.y=newy,node.z=newz;
				q.push(node);
				inq[newx][newy][newz] = true;
			}
		}
	}
	if(tot>=t) return tot;
	else return 0;
}

int main(){
	
	scanf("%d%d%d%d",&n,&m,&slice,&t);
	for(int z=0;z<slice;z++){
		for(int x=0;x<n;x++){
			for(int y=0;y<m;y++){
				scanf("%d",&pixel[x][y][z]);
			}
		}
	}
	int ans=0;
	for(int z=0;z<slice;z++){
		for(int x=0;x<n;x++){
			for(int y=0;y<m;y++){
				if(pixel[x][y][z]==1&&inq[x][y][x]==false){
					ans+=bfs(x,y,z);
				}
			}
		}
	}
	
	printf("%d\n",ans);
	return 0;
	
	
	
	return 0;
}

おすすめ

転載: blog.csdn.net/aixiaoxiao13/article/details/121409589