ACWing471. 棋盘-DFS剪枝

2024-05-15 17:12
文章标签 dfs 棋盘 剪枝 acwing471

本文主要是介绍ACWing471. 棋盘-DFS剪枝,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

思路

本思路参考博客AcWing 471. 棋盘 - AcWing

约束方程: 

代码

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 110, INF = 0x3f3f3f3f;
int g[N][N], n, m, dist[N][N];
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};void dfs(int x, int y, int cost, int used) 
{if (dist[x][y] <= cost) return ; //花费更少,说明没必要DFS,直接剪枝dist[x][y] = cost;if (x == m && y == m) return ;for (int i = 0; i < 4; i ++ ) //四个方向深搜{int nx = x + dx[i], ny = dy[i] + y;if (nx < 1 || nx > m || ny < 1 || ny > m) continue ;if (g[nx][ny] == -1)  //无颜色{if (used) continue ; //已经使用魔法的不能再次使用else {g[nx][ny] = g[x][y];dfs(nx, ny, cost + 2, 1);g[nx][ny] = -1;}}else if (g[nx][ny] == g[x][y]) dfs(nx, ny, cost, 0);//颜色相同else dfs(nx, ny, cost + 1, 0);//颜色不同,使用魔法}
}int main() 
{scanf("%d%d", &m, &n);memset(g, -1, sizeof g);while (n -- ) {int a, b, c;scanf("%d%d%d", &a, &b, &c);g[a][b] = c;}memset(dist, 0x3f, sizeof dist);dfs(1, 1, 0, 0);if (dist[m][m] == INF) puts("-1");else printf("%d\n", dist[m][m]);return 0;
}

xmuoj:xmuoj | 璃月森林探险:符文之路 

这篇关于ACWing471. 棋盘-DFS剪枝的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/992425

相关文章

poj 1564 Sum It Up -- DFS 递归

题意:给一个数 t ,以及 n 个数,求 n 个数中的几个数加起来的和为 t 的情况有多少种。 注意:题目要求相同的组合方式不能出现2次,即 “3 4 1 1 1 1 ” 的结果为:“1+1+1”。 思路:一个  for  循环遍历一遍,每个 i 表示以当前数为起点开始一次DFS递归,当所遍历的和为 t 时,输出该组合方式,如果大于 t 则返回,小于则往下递归。以二维数组保存已经输出过的数据,

Matlab 单目相机标定(内置函数,棋盘格)

文章目录 一、简介二、实现代码三、实现效果参考资料 一、简介 具体的标定原理可以参阅之前的博客Matlab 单目相机标定(内置函数),这里实现对棋盘格数据的标定过程。 二、实现代码 getCameraCorners.m function [camCorners, usedImIdx, imCheckerboard] = getCameraCorners(cali

头歌资源库(14)残缺棋盘

一、 问题描述  二、算法思想   首先,将2^k × 2^k的棋盘划分为四个相等大小的子棋盘,定义为左上、左下、右上和右下四个子棋盘。 然后,根据残缺格的坐标,确定其中一个子棋盘是不完整的,即残缺子棋盘。假设残缺子棋盘是左上子棋盘。 接下来,分以下三种情况进行处理: 当k=1时,即棋盘大小为2×2时,直接填充序号即可。 当残缺子棋盘的坐标位于左上子棋盘的右下角时,将左上子棋盘的

洛谷 P1141 01迷宫 (dfs解决)

题目描述 有一个仅由数字 0 与 1 组成的 n×n 格迷宫。若你位于一格 0 上,那么你可以移动到相邻 4 格中的某一格 1 上,同样若你位于一格 1 上,那么你可以移动到相邻 4 格中的某一格 0 上。 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。 输入格式 第一行为两个正整数 𝑛,𝑚。 下面 𝑛 行,每行 𝑛 个字符,字符只可能是 0 或者

[HDU 4324] Triangle LOVE (拓扑排序,DFS)

HDU - 4324 题意是,一张有 N个点的图,保证每两个点之间有且只有一条有向边连接 求是否存在三元环 用拓扑排序判环,如果存在环,则一定存在三元环 证明如下: 不存在二元环 设存在 n(n>=3)元环 p1->p2->p3->…->pn->p1 1) 若存在边 p3->p1,则存在三元环 (p1->p2->p3->p1) 2) 若不存在 p3->p1,则必然存在 p1->p3

[CSU - 1811 (湖南省赛16)] Tree Intersection (dfs序维护子树+离线询问+树状数组)

CSU - 1811 (湖南省赛16) 给定一棵树,每个节点都有一个颜色 问割掉任意一条边,生成的两个子树中颜色集合的交集大小 这个是 dfs序处理子树 + 离线询问 + bit维护 的解法 首先问题转化为求解一个子树中有多少种颜色以及独有颜色的数量 用总的颜色数量减去独有颜色数量即为这棵子树的答案 先做一遍 dfs,再按 dfs序重新组建颜色序列 这样对子树的询问,就变成

DFS走迷宫(懒猫老师C++完整版)

DFS走迷宫的C++完整版 知识储备一:普通动态二维数组的构造二:栈的构造三:栈的逆序遍历 Main文件代码 该版本代码是配合 懒猫老师用DFS走迷宫视频 基于C++基础所写的完整版(实现了栈逆序遍历),适合小白系统性的学习和复习知识点,只要将下文.h和.cpp和main文件所展示的代码结合起来就是个完整的代码。 知识储备 一:普通动态二维数组的构造 二维数组中不同行的内

fast DFS 单机使用实例

fast DFS 单机使用实例 我在一台服务器上简单测试了fastdfs。client, tracker, storage server都是同一个物理服务器。   1. 编译fastdfs:   sles207:/opt/mars/FastDFS # ./make.sh   storage_service.o: In function `storage_service_init':/opt/ma

深度神经网络——决策树的实现与剪枝

概述 决策树 是一种有用的机器学习算法,用于回归和分类任务。 “决策树”这个名字来源于这样一个事实:算法不断地将数据集划分为越来越小的部分,直到数据被划分为单个实例,然后对实例进行分类。如果您要可视化算法的结果,类别的划分方式将类似于一棵树和许多叶子。 这是决策树的快速定义,但让我们深入了解决策树的工作原理。 更好地了解决策树的运作方式及其用例,将帮助您了解何时在机器学习项目中使用它们。 决

[深度优先搜索DFS]迷宫问题

描述 定义一个二维数组: int maze[5][5] = {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,}; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。 输入 一个5 × 5的二维数组,表示一个迷宫。数