使用dfs算法,先膜拜y哥,然后之间看代码吧,注释挺多的

#include<bits/stdc++.h>
#include<iostream>
using namespace std;
//题目来源: 
//https://ac.nowcoder.com/acm/contest/8053/G
//这道题是采用dfs,y哥牛逼 
const int N=120;//根据给的地图大小来定 
int path[N][N],minn=0x3f3f3f3f;//path用来存这个地图各个点的权值,而minn是int能达到的最大值,是为了优化时间, 
bool st[N][N];                // 最初我是用sum数组来存c的,但最后还需要遍历和比较,耗费时间,dfs传递的c是路径权值之和 
int n;                    //要开全局的,不然函数里边怎么比 
int dx[4]={-1,0,1,0},dy[4]={0,-1,0,1};//对于每一个地图上的点,都有上下左右四个点 
void dfs(int a,int b,int c)
{
    if(a==n&&b==n)                        //先写跳出递归的条件 
    {
        minn=min(c,minn);
        return ;
    }
    if(c>minn) return ;                    //优化,减少时间,因为输出最小值 
    for(int i=0;i<4;i++)
    {
        int x=a+dx[i],y=b+dy[i];
        if(!st[x][y]&&path[x][y]>0&&x>0&&x<=n&&y>0&&y<=n)//遍历周围四个点 
        {
            c+=path[x][y];
            st[x][y]=true;
            dfs(x,y,c);                        //传递点和权值和 
            st[x][y]=false;                    //回溯还原 
            c-=path[x][y];
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n; 
    for(int i=1;i<=n;i++)
    {
        for(int k=1;k<=n;k++)
        {
            cin>>path[i][k];    
        }
    }
    st[1][1]=1;
    dfs(1,1,path[1][1]);
    if(minn==0x3f3f3f3f) 
    {
        cout<<"0"<<endl;
        return 0;
    }
    cout<<minn<<endl;
    return 0;
}