欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > 算法·回溯

算法·回溯

2025/7/4 0:56:29 来源:https://blog.csdn.net/2301_80132162/article/details/147052370  浏览:    关键词:算法·回溯

回溯和搜索的区别

可以简单理解为回溯就是:搜索+剪枝优化

回溯解决问题的数量级:10

回溯的应用:

  • 排列问题:
  • 组合问题:
  • 剪枝优化:

回溯算法的套路

二维回溯

  • 两个变量,按照两层for循环的形式搜索所有可能,注意换行。
	if(x>n){return ;}int next_xx = y == n ? x + 1 : x;int next_yy = y == n ? 1 : y + 1;dfs(next_xx,next_yy,...);
  • P1784 数独:标准的例题

(80分代码)

void dfs(int x, int y) {if (x > 9||y > 9) {printsudo();exit(0);}if (graph[x][y]) {if (y == 9)dfs(x + 1, 1);else dfs(x, y + 1);return;//防止回溯后篡改(x,y)}for (int k = 1; k <= 9; k++) {if (isvalid(x, y, k)) {graph[x][y] = k;if (y == 9)dfs(x + 1, 1);else dfs(x, y + 1);graph[x][y] = 0;}}
}
  • P2040 打开所有的灯:这里要注意到一个灯不会被开两次。(即使不是同时开关两次)。
void dfs(int x, int y, int times) {if (isvalid()) {ans = min(ans, times);return;}if (x > n) {return;}int next_xx = y == 3 ? x + 1 : x;int next_yy = y == 3 ? 1 : y + 1;dfs(next_xx, next_yy, times);//不点击graph[x][y] =graph[x][y]==0?1:0;//1->0,0->1for (int i = 0; i < 4; i++) {int next_x = x + dir[i][0];int next_y = y + dir[i][1];if (next_x >= 1 && next_x <= n && next_y >= 1 && next_y <= n) {graph[next_x][next_y]=graph[next_x][next_y] == 0 ? 1 : 0;}}//cout << "x:" << x << " y:" << y << endl;//printout();dfs(next_xx, next_yy, times + 1);//点击graph[x][y] = graph[x][y] == 0 ? 1 : 0;//1->0,0->1for (int i = 0; i < 4; i++) {int next_x = x + dir[i][0];int next_y = y + dir[i][1];if (next_x >= 1 && next_x <= n && next_y >= 1 && next_y <= n) {graph[next_x][next_y] = graph[next_x][next_y] == 0 ? 1 : 0;}}}

最后检查

  • 使用DFS遍历所有结果,对每个结果只在最后收集时检查
  • 这个搜索次数过大,一般都会超时
  • P10386 [蓝桥杯 2024 省 A] 五子棋对弈:不设时间限制的题目,可以采用这种思路。

前向检查剪枝

  • 前向检查就是提前排除下一个潜在状态中不合理的值减少搜索范围。有的时候不需要isvalid()作最后的检查!
  • P9241 [蓝桥杯 2023 省 B] 飞机降落:前向检查优化

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词