dfs深搜暴力总结

在这里插入图片描述

走路径类型

走方格

这道题dfs会超时,仅作参考。

本题求路径总数,且起点固定1,1,终点固定n,m
设置vis数组判断这个格子是否走过,避免重复走。
dfs(1,1)表示从1,1出发,因此需要把这个格子标记为true。


import java.io.*;
import java.util.*;
public class eighth {
	static int N=35;
	static int M=35;
	
	static int count=0;
	static int n,m;
	
	static int a[][]=new int[N][M];
	static int f[][]=new int[N][M];
	static boolean isVisited[][]=new boolean[N][M];
	static int dx[]= {0,1};
	static int dy[]= {1,0};
	
	public static void dfs(int x,int y) {

		if(x==n && y==m) {
			count++;
			return;
		}
		
		for(int i=0;i<2;i++) {
			int xx=x+dx[i];
			int yy=y+dy[i];
			
			if(xx<1 ||yy<1 || xx>n || yy>m) continue;//边界错了
			if(xx%2==0 && yy%2==0) continue;
			if(isVisited[xx][yy]) continue;
			
			isVisited[xx][yy]=true;
			dfs(xx,yy);
			isVisited[xx][yy]=false;
		}
	}
	
	public static void main(String args[]) {
		Scanner sc=new Scanner(System.in);
		n=sc.nextInt();
		m=sc.nextInt();
		
		isVisited[1][1]=true;//这里忘记标记
		dfs(1,1);
		dp();
		System.out.println(count+" "+f[n][m]);
	}
}

摆花P1970

在这里插入图片描述

这道题可使用贪心,这里叙述暴力搜索逻辑(会超时):
枚举所有方案(每株花有选与不选的可能),最后check是否合法,O(2^n)的做法。

选择类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DFS(Depth-First Search)即深度优先搜索,是一种常用的图遍历算法。在DFS中,我们从图的某个顶点开始,沿着一条路径尽可能深的搜索,直到无法继续为止,然后回溯到前一个节点,再继续搜索其他未访问的节点。 在C++中,我们可以使用递归或者栈来实现DFS算法。下面是一个使用递归实现DFS的示例代码: ```cpp #include <iostream> #include <vector> using namespace std; vector<vector<int>> graph; // 图的邻接表表示 vector<bool> visited; // 记录节点的访问状态 // 深度优先搜索函数 void dfs(int node) { visited[node] = true; // 标记当前节点为已访问 // 对于当前节点的所有未访问的邻居节点,递归调用dfs函数 for (int neighbor : graph[node]) { if (!visited[neighbor]) { dfs(neighbor); } } } int main() { int numNodes, numEdges; cin >> numNodes >> numEdges; // 初始化图的邻接表和访问状态数组 graph.resize(numNodes); visited.resize(numNodes, false); for (int i = 0; i < numEdges; i++) { int u, v; cin >> u >> v; graph[u].push_back(v); graph[v].push_back(u); // 若为有向图则可省略这行 } int startNode; // 指定DFS的起始节点 cin >> startNode; dfs(startNode); // 输出所有已访问的节点 for (int i = 0; i < numNodes; i++) { if (visited[i]) { cout << i << " "; } } cout << endl; return 0; } ``` 在上述代码中,我们通过邻接表来表示图,并使用visited数组记录节点的访问状态。dfs函数按照深度优先的方式遍历图,递归调用自身来访问当前节点的邻居节点。最后,我们输出所有已访问的节点。 需要注意的是,DFS算法对于有环的图需要进行环的检测,以避免无限循环。另外,如果图是一个森林(由多个连通分量组成),我们需要对每个连通分量都执行DFS算法。 希望这个示例能帮助你理解DFS在C++中的实现。如果有任何疑问,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值