强化阶段 Day 18 算法笔记 8.1&8.2 深度,广度优先搜索

目录

1.背包

2.基础

3.Integer Factorization

4.块

5.bfs走迷宫

6.Acute Stroke


1.背包

const int maxn=30;
int n,v,max_value;
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]);
}

void dfs(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]);
	}
}

2.基础

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

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

3.Integer Factorization

#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;

const int maxn=500;
int n,k,p;
vector<int>fac,ans,temp;
int getf(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=getf(++i);
	}
}
int maxfacsum=-1;
void dfs(int index,int numk,int sums,int facsum){
	if(sums==n&&numk==k){
		if(facsum>maxfacsum){
			maxfacsum=facsum;
			ans=temp;
		}
		return;
	}
	if(sums>n||numk>k) return;
	if(index>0){
		temp.push_back(index);
		dfs(index,numk+1,sums+fac[index],facsum+index);
		temp.pop_back();
		dfs(index-1,numk,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 = ",n);
		for(int i=0;i<ans.size();i++){
			printf("%d^%d",ans[i],p);
			if(i!=ans.size()-1) printf(" + ");
		}
	}

	return 0;
}

4.块

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

int n,m;
int martix[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){
	if(x<=0||x>=n||y>=m||y<=0) return false;
	if(martix[x][y]==0||inq[x][y]==true) return false;
	return true;
}

void bfs(int x,int y){
	queue<nodes> q;
	node.x=x,node.y=y;
	q.push(node);
	inq[x][y]=true;
	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=x,node.y=y;
				q.push(node);
				inq[newx][newy]=true;
			}
		}
	}
}

void dfs(int x,int y){
	if(judge(x,y)==false) return;
	else inq[x][y]=1;
	for(int i=0;i<4;i++){
		int newx=x+x[i];
		int newy=y+y[i];
		dfs(newx,newy);
	}
}

5.bfs走迷宫

#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;

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

int n,m;
char martix[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){
	if(x>=n||x<0||y>=m||y<0) return false;
	if(inq[x][y]) return false;
	if(martix[x][y]=='*') 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;
		else{
			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;
					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++){
			martix[i][j]=getchar();
		}
		martix[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;
}

6.Acute Stroke

#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;

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

int n,m,l,t;
int martix[1287][129][61];
bool inq[1287][129][61]={false};
int X[6]={0,0,0,0,1,-1};
int Y[6]={0,0,1,-1,0,0};
int Z[6]={1,-1,0,0,0,0};

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

int bfs(int x,int y,int z){
	int tot=0;
	node.x=x,node.y=y,node.z=z;
	queue<nodes> q;
	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+X[i];
			int newy=top.y+Y[i];
			int newz=top.z+Z[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,&l,&t);
	for(int z=0;z<l;z++){
		for(int x=0;x<n;x++){
			for(int y=0;y<m;y++){
				scanf("%d",&martix[x][y][z]);
			}
		}
	}
	int ans=0;
	for(int z=0;z<l;z++){
		for(int x=0;x<n;x++){
			for(int y=0;y<m;y++){
				if(martix[x][y][z]==1&&inq[x][y][z]==false){
					ans+=bfs(x,y,z);
				}
			}
		}
	}
	printf("%d\n",ans);
	
	
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值