使用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;
}
京公网安备 11010502036488号