病毒问题dfs
使用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; }