蒟蒻的搜索
查看原帖
蒟蒻的搜索
250699
mot1ve楼主2020/9/27 21:11

为什么样例输出是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;
} 
2020/9/27 21:11
加载中...