您的位置:首页 > 其它

51Nod 1489 蜥蜴和地下室 DFS

2017-12-11 19:55 281 查看


第一次在51Nod上用深搜....

注意题目说的是血量小于0才死亡。我就把血量全部加一,最后判断血量小于等于0

为的是避免刚开始把第一个和最后一个弄死的时候的误差

#include<iostream>
#include<queue>
#include<vector>
#include<stack>
#include<algorithm>
#include<cmath>
#include<set>
#include<map>
#include<cstdio>
using namespace std;
int n,a,b;
int num[20],out=1<<30;
int check(){
for(int i=0;i<n;i++)
if(num[i]>0) return 0;
return 1;
}
void dfs(int index,int len){
if(check()){
out=min(len,out);
return ;
}
for(int i=index;i<n-1;i++){
if((num[i]<=0&&num[i-1]<=0&&num[i+1]<=0)||len>out) continue;
num[i]-=a;
num[i-1]-=b;
num[i+1]-=b;
dfs(i,len+1);
num[i]+=a;
num[i-1]+=b;
num[i+1]+=b;
}
}
int main(){
cin>>n>>a>>b;
for(int i=0;i<n;i++){
scanf("%d",&num[i]);
num[i]++;
}
int step=0;
if(num[0]%b!=0){

step+=(num[0]/b+1);
num[1]-=(num[0]/b+1)*a;
num[2]-=(num[0]/b+1)*b;
num[0]=-1;
}
else{
step+=(num[0]/b);
num[1]-=(num[0]/b)*a;
num[2]-=(num[0]/b)*b;
num[0]=-1;
}
if(check()){
cout<<step<<endl;
return 0;
}
if(num[n-1]%b!=0){
step+=(num[n-1]/b+1);
num[n-2]-=(num[n-1]/b+1)*a;
num[n-3]-=(num[n-1]/b+1)*b;
num[n-1]=-1;
}
else{
step+=(num[n-1]/b);
num[n-2]-=(num[n-1]/b)*a;
num[n-3]-=(num[n-1]/b)*b;
num[n-1]=-1;
}
dfs(1,step);
cout<<out<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: