为什么样例输出是10,我好傻。
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
int n,A,B,C,k,ans=INF;
int a[110][110],mem[110][110][12];//记忆化搜索,不然死循环
void dfs(int x,int y,int sum,int res)//x,y为当前位置,sum为花费,res为剩余步数
{
if(a[x][y]==-1)//判断出界
return ;
if(mem[x][y][res]<=sum)
return ;
mem[x][y][res]=sum;
//res为剩下的可走的步数
if(sum>=ans)
return ;
if(x==n&&y==n)
{
ans=min(ans,sum);
return ;
}
if(a[x][y]==1)//必须得补油
{
dfs(x,y+1,sum+A,k-1);
dfs(x,y-1,sum+A+B,k-1);
dfs(x+1,y,sum+A,k-1);
dfs(x-1,y,sum+A+B,k-1);
}
else if(res==0)//需要补油
{
dfs(x,y+1,sum+A,k-1);
dfs(x,y-1,sum+A+B,k-1);
dfs(x+1,y,sum+A,k-1);
dfs(x-1,y,sum+A+B,k-1);
}
else
{
dfs(x,y+1,sum,res-1);
dfs(x,y-1,sum+B,res-1);
dfs(x+1,y,sum,res-1);
dfs(x-1,y,sum+B,res-1);
}
}
int main()
{
cin>>n>>k>>A>>B>>C;
for(int i=0;i<=n+1;i++)
{
a[0][i]=a[i][0]=a[i][n+1]=a[n+1][i]=-1;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&a[i][j]);
for(int k=0;k<=10;k++)
{
mem[i][j][k]=INF;
}
}
}
dfs(1,1,0,k);
cout<<ans;
return 0;
}