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;
}
相关文章推荐
- 51nod 1489 蜥蜴和地下室 暴力dfs
- 51nod 1489 蜥蜴和地下室 dfs
- 【51Nod】1489 - 蜥蜴和地下室(dfs)
- 51nod 1489 蜥蜴和地下室(DFS)
- 51Nod-1489 蜥蜴和地下室(暴力DFS)
- 51nod 1489 蜥蜴和地下室(dfs)
- 51nod 1489 蜥蜴和地下室 dfs
- 51 Nod 1489 蜥蜴与地下室(DFS)
- 1489 蜥蜴和地下室 51NOD
- 51nod oj 1489 蜥蜴和地下室【dfs】
- 51nod 1489 蜥蜴和地下室
- 51Nod 1489 蜥蜴和地下室
- 51nod 1489 蜥蜴和地下室
- 51nod 1489蜥蜴和地下室
- 51Nod-1489-蜥蜴和地下室
- 蜥蜴和地下室 51Nod - 1489
- 51nod 1489 蜥蜴和地下室(dfs or dp)
- 51Nod-1489-蜥蜴和地下室
- 51Nod 1489 蜥蜴和地下室
- JAVA学习45_51Nod-1489-蜥蜴和地下室