夜猫子的自救


私信TA

用户名:yemaozidezijiu

访问量:152

签 名:

等  级
排  名 44538
经  验 332
参赛次数 0
文章发表 1
年  龄 0
在职情况 学生
学  校 河南师范大学
专  业

  自我简介:

解题思路:首先确定该题目是属于数据结构中的连通图的遍历问题,想到要使用dfs即深度优先遍历,属于一个递归,回溯和剪枝问题

注意事项:要注意递归循环时需要在设置一个数组来标记该点有没有被访问过,否则会出现再次回到已访问的点的情况,我的代码只能勉强通过测试但是没办法解决

2 2

1 2

3 6

这种情况

参考代码:

#include<stdio.h>

#include<iostream>

#include<algorithm>//使用min()函数需要加的头文件

using namespace std;

int m,n;//定义为全局变量

int total=0;

int a[10][10];//怎么

int ans=100;

int visited[10][10];

void f(int i,int j,int sum,int cnt)//深搜,找什么在变化,总数在变,坐标在变,计数在变,坐标向四个方向变化

{

if(sum>total/2) return ;

if(sum==total/2)

{ ans=min(ans,cnt);

return ;}

visited[i][j]=1;

//可以有四个分支

if(i+1<n&&visited[i+1][j]==0)//跑到最后一行只能往左右走,采用递归调用,还要考虑可能会有再次回到出发点的情况,加一个数组来标志着有没有被访问过

{f(i+1,j,sum+a[i][j],cnt+1);}

if(j+1<m&&visited[i][j+1]==0){f(i,j+1,sum+a[i][j],cnt+1);}

if(i-1>=0&&visited[i-1][j]==0){f(i-1,j,sum+a[i][j],cnt+1);}

if(j-1>=0&&visited[i][j-1]==0){f(i,j-1,sum+a[i][j],cnt+1);}

visited[i][j]=0;

}


int main()

{

int i,j;

cin>>m>>n;

for(i=0;i<n;i++)

{

for(j=0;j<m;j++)

{

cin>>a[i][j];

total+=a[i][j];

visited[i][j]=0;//没走过是0

}

}

f(0,0,0,0);

printf("%d",ans);

}


 

0.0分

1 人评分

  评论区

其实本来我的解题思路是完全错误的,这个是在b站上看的大佬的解题视频,希望会对大家解题有帮助
2022-03-15 20:54:20
  • «
  • 1
  • »