RT,如果在dfs函数里把判断到达终点的if语句部分放在末尾的话就能AC
#include<bits/stdc++.h>
using namespace std;
bool f[21][21]; //联通地图
int value[21]; //每个洞穴里的地雷数目
int n; //洞穴数目
int path[21]; //记录每次路径
int ans[21]; //更新最终答案
bool check[21]; //检查某点是否走过
int maxn; //记录单路径地雷数的最大值
int step_record; //记录每次经过的洞穴总数
bool judge(int x) //从x是否还能继续走
{
for(int i=1;i<=n;i++)
{
if(f[x][i]&&!check[i]) //可以从x走到i 且i未被探索过
{
return true; //可以继续走
}
}
return false; //遍历过所有点之后发现无法继续走
}
int dfs(int position, int count, int sum)
{
//check[position]=1;
path[count]=position;
check[position]=1;
sum+=value[position];
for(int i=1;i<=n;i++)
{
if(f[position][i]&&!check[i]) //找到下一个可以连接的点 且这个点未走到过
{
//check[i]=1; //把要走的的点标记为已走
//path[count]=i; //路径记录
//sum+=value[i]; //地雷数累加
dfs(i,count+1,sum);
//check[i]=0;
}
}
check[position]=0;
if(!judge(position)) //道路已探索到尽头
{
if(sum>maxn)
{
maxn=sum; //?
step_record=count;
for(int i=1;i<=step_record;i++)
{
ans[i]=path[i];
}
return sum;
}
return sum;
}
return sum; //?
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&value[i]);
}
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
cin>>f[i][j];
}
}
maxn=-999;
for(int i=1;i<=n;i++)
{
//check[i]=1;
path[1]=i;
maxn=max(maxn,dfs(i,1,0));
//check[i]=0;
}
for(int i=1;i<=step_record;i++)
{
printf("%d",ans[i]);
printf(" ");
}
printf("\n");
printf("%d",maxn);
return 0;
}
但如果把判断的那部分放到开头就会在第三个点挂掉
#include<bits/stdc++.h>
using namespace std;
bool f[21][21]; //联通地图
int value[21]; //每个洞穴里的地雷数目
int n; //洞穴数目
int path[21]; //记录每次路径
int ans[21]; //更新最终答案
bool check[21]; //检查某点是否走过
int maxn; //记录单路径地雷数的最大值
int step_record; //记录每次经过的洞穴总数
bool judge(int x) //从x是否还能继续走
{
for(int i=1;i<=n;i++)
{
if(f[x][i]&&!check[i]) //可以从x走到i 且i未被探索过
{
return true; //可以继续走
}
}
return false; //遍历过所有点之后发现无法继续走
}
int dfs(int position, int count, int sum)
{
//check[position]=1;
path[count]=position;
check[position]=1;
sum+=value[position];
if(!judge(position)) //道路已探索到尽头
{
if(sum>maxn)
{
maxn=sum; //?
step_record=count;
for(int i=1;i<=step_record;i++)
{
ans[i]=path[i];
}
return sum;
}
return sum;
}
for(int i=1;i<=n;i++)
{
if(f[position][i]&&!check[i]) //找到下一个可以连接的点 且这个点未走到过
{
//check[i]=1; //把要走的的点标记为已走
//path[count]=i; //路径记录
//sum+=value[i]; //地雷数累加
dfs(i,count+1,sum);
//check[i]=0;
}
}
check[position]=0;
return sum; //?
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&value[i]);
}
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
cin>>f[i][j];
}
}
maxn=-999;
for(int i=1;i<=n;i++)
{
//check[i]=1;
path[1]=i;
maxn=max(maxn,dfs(i,1,0));
//check[i]=0;
}
for(int i=1;i<=step_record;i++)
{
printf("%d",ans[i]);
printf(" ");
}
printf("\n");
printf("%d",maxn);
return 0;
}
求助一下各位这是为什么呢