算法打卡Day3(DFS+BFS+剪枝)

1、POJ1190 生日蛋糕

方法:DFS+剪枝

#include<iostream>
using namespace std;

int N, M;
int min_s=0x7fffffff;

int min_v(int m){
	int v=0;
	for(int r1=M-m;r1>=1;r1--){
		int h1=r1;
		v+=r1*r1*h1;
	}
	return v;
}

int max_v(int r,int h,int m){
	int v=0;
	for(int r1=r-1,h1=h-1;m<=M;r1--,h1--,m++){
		v+=r1*r1*h1;
	}
	return v;
}

void dfs(int r,int h,int m,int s,int v){
	if(m==M&&v==N&&s<min_s){
		min_s=s;
		return;
	}
    
	if(min_v(m)>N-v||max_v(r,h,m)<N-v)
		return;
	for(int r1=r-1;r1>=M-m;r1--){
		for(int h1=h-1;h1>=M-m;h1--){
			dfs(r1,h1,m+1,s+2*r1*h1,v+r1*r1*h1);
		}
	}
}


int main(){
	cin>>N>>M;
	for(int r=M;r*r<=N;r++){
		for(int h=N/(r*r);h>=M;h--){
			int s=r*r+r*h*2;
			int v=r*r*h;
			dfs(r,h,1,s,v);
		}
	}
	if(min_s==0x7fffffff)
		cout<<0<<endl;
	else
		cout<<min_s<<endl;
	return 0;
}

2、POJ3278 捉牛

方法:BFS+剪枝

#include<iostream>
#include<queue>
using namespace std;

bool visited[100005];
int minute[100005];
queue<int> q;

int bfs(int N,int K){
	int next;
	q.push(N);
	visited[N]=true;
	minute[N]=0;
	while(!q.empty()){
		int tmp=q.front();
		q.pop();
		for(int i=0;i<3;i++){
			if(!i)
				next=tmp-1;
			else if(i==1)
				next=tmp+1;
			else
				next=2*tmp;
			if(next<0||next>100000)
				continue;
			if(!visited[next]){
				q.push(next);
				minute[next]=minute[tmp]+1;
				visited[next]=true;
			}
			if(next==K) return minute[next];
		}
	}
}

int main(){
	int N,K;
	cin>>N>>K;
	if(N>=K) cout<<N-K<<endl;
	else cout<<bfs(N,K)<<endl;
	return 0;
} 
posted @ 2021-05-19 21:20  Barrymeng  阅读(46)  评论(0)    收藏  举报