算法打卡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;
}

浙公网安备 33010602011771号