基础算法题——德邦国王(dfs、剪枝)

2023-11-07

德邦国王

题目1
题目
题目3


题目还算中规中矩,就是剪枝比较麻烦。
解题思路:dfs
剪枝:
①、移动次数不超过设定值 M。
②、若有解,则后面的步骤不可大于该解的值。
③、不断查询完美矩阵与当前矩阵不同的个数 t 。
t - 1 为最快可将当前矩阵移动成完美矩阵的步数,若 t - 1 + 已经移动的步数 cnt 大于 最优解时,则该情况不必再往下移动。


AC代码

#include<bits/stdc++.h>
using namespace std;
int now[10][10], per[10][10];
int n, k, m, ans=20;
struct node{
	int dx, dy;
}p[10];

//判断 x 矩阵是否是 per 矩阵 
bool judge1(int jz[10][10], int cnt){
	int t=0;
	for(int i=1; i<=n; i++)
	for(int j=1; j<=n; j++){
		if(jz[i][j]!=per[i][j]){
			t++;
		}
	} 
	if(t>ans-cnt+1||t>m-cnt+1) return true;
	if(t==0) ans = min(cnt, ans);
	return false;
}

void dfs(int jz[10][10], int cnt, int x, int y, int z){
	if(cnt>m||cnt>=ans||judge1(jz, cnt)) 
		return;
	
	for(int i=0; i<k; i++){
		if(i==z) continue;
		int dx = p[i].dx;
		int dy = p[i].dy;
		if(x+dx<=n&&y+dy<=n&&x+dx>=1&&y+dy>=1){
			jz[x][y]=jz[x+dx][y+dy];
			jz[x+dx][y+dy]=2;
			dfs(jz, cnt+1, x+dx, y+dy, i);
			jz[x+dx][y+dy]=jz[x][y];
			jz[x][y]=2;
		}
	}
}

int main(){
	int x, y;
//	freopen("data.txt", "r", stdin);
	cin>>n>>k>>m;
	for(int i=0; i<k; i++)
		cin>>p[i].dx>>p[i].dy;
	
	for(int i=1; i<=n; i++)
	for(int j=1; j<=n; j++){
		cin>>now[i][j];
		if(now[i][j]==2) x=i,y=j;
	}
	for(int i=1; i<=n; i++)
	for(int j=1; j<=n; j++)
		cin>>per[i][j];
	
	dfs(now, 0, x, y, -1);
	if(ans!=20)
		cout<<ans<<endl;
	else
		cout<<"-1\n";
		
	return 0;
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基础算法题——德邦国王(dfs、剪枝) 的相关文章

随机推荐

  • ell服务器专用pe系统,GitHub - elltor/smpe-admin: 后端通用开发框架

    SMPE ADMIN后台管理系统 项目简介 一个基于EL ADMIN Spring Boot 2 1 0 Mybatis Plus JWT Spring Security Redis Vue的前后端分离的后台管理系统 开发文档 待完善 默认
  • 集群架构总结(Kafka、redis,zk,es)

    ZK集群 1 zk集群节点可见 通过配置文件达到节点间相互可见 2 为什么集群设置奇数个节点 1 奇数节省资源 zk容错 zk节点剩下的个数必须要大于挂掉的节点 大于n 2 整个集群才可用 5节点容错2个 6节点容错2个 2 奇数节点集群可
  • CPPUTest 单元测试框架(针对 C 单元测试的使用说明)

    CPPUTest 虽然名称上看起来是 C 的单元测试框架 其实它也是支持测试 C 代码的 本文主要介绍用CPPUTest来测试 C 代码 C 没用过 平时主要用的是C C 相关的内容都省略了 本文基于 debian v7 6 x86 64
  • 2023零基础 Python 学习路线图,转行学Python让你少走弯路~

    这是我刚开始学习python时的一套学习路线 从入门到上手 不敢说精通 哈哈 希望对大家有帮助哈 大家需要高清得python学习路线可以私信我 学习 即可获取 一 Python入门 环境搭建 变量 数据类型 二 Python运算符 条件结构
  • 小程序常见的面试题

    小程序常见的面试题 1 简单描述下微信 程序的相关 件类型 答 微信 程序项 结构主要有四个 件类型 如下 WXML 是框架设计的 套标签语 结合基础组件 事件系统 可以构建出 的结构 内部主要是微信 定义的 套组件 WXSS WeiXin
  • Linux操作系统之进程间通讯—共享内存与消息队列

    文章目录 一 共享内存 1 共享内存的原理 2 共享内存的实现 三 消息队列 1 消息队列原理 2 消息队列实现 一 共享内存 1 共享内存的原理 共享内存为多个进程之间共享和传递数据提供了一种有效的方式 共享内存是先在物理内存上申请一块空
  • 2.linux git显示分支名

    linux git显示分支名 linux git显示分支名 解决linux里面git不会显示分支名 1 在 bash profile 里面添加 display the git branch name function git branch
  • 视觉SLAM理论与实践第四节课习题

    4 矩阵微分 2 分 约 1 5 小时 在优化中经常会遇到矩阵微分的问题 例如 当 变量为向量 x 求标量函数 u x 对 x 的导数时 即 为矩阵微分 通常线性代数教材不会深 探讨此事 这往往是矩阵论的内容 我在 ppt 录下为你准备了
  • ubuntu18一直紫屏,无法进入图形界面

    ubuntu18一直紫屏 无法进入图形界面 一直紫屏的原因 解决方法 首先进入想办法进入桌面环境 第一种方法 第二种方法 然后修改一些配置文件 一直紫屏的原因 使用apt upgrade更新系统后 出现桌面卡死 很是纳闷 也重装了两次系统
  • ChatGPT研究分享:机器第一次开始理解人类世界

    0 为什么会对ChatGPT感兴趣 一开始 我对ChatGPT是没什么关注的 无非就是有更大的数据集 完成了更大规模的计算 所以能够回答更多的问题 但后来了解到几个案例 开始觉得这个事情并不简单 我先分别列举出来 具体解读在文末说明 1 C
  • ChatGPT简单介绍

    div class markdown views div
  • Git Extensions的安装与使用

    一 介绍 Git Extensions是一个工具包 旨在使Windows下的Git更直观 功能 Git的Windows资源管理器集成 功能丰富的Git用户界面 32位和64位支持 二 安装 csdn下载地址 GitExtensionhttp
  • 新唐NUC980使用记录:访问以太网(LAN8720A) & 启用SSH

    文章目录 目的 修改内核以访问以太网 制作根文件系统并启用SSH 总结 目的 这篇文章主要测试访问以太网 PHY为LAN8720A 以及启用SSH 这篇文章中内容均在下面的开发板上进行测试 新唐NUC980使用记录 自制开发板 基于NUC9
  • 为什么一定要使用二级指针,而一级为什么就不行呢??

    为什么一定要使用二级指针 而一级为什么就不行呢 不是说函数中传递指针 在函数中改变指针的值 就是在改变 实参中的数据信息嘛 额 其实吧 上边说的也对 可问题就在这块了 问题是 在建立二叉树的过程中 不是改变了形参的值 而是 改变了形参的指向
  • Docker: network nat is ambigous

    初次使用docker投入开发使用 感觉不要太爽 强烈推荐入坑docker 但docker国内相关资料偏少 无论是学习或是排查问题 都不是很方便 入门学习推荐微信公众号magiccodes的 Docker最全教程 系列文章 有兴趣可自行查找
  • Kubernetes部署redis主从集群

    目标 部署Redis leader节点 部署两个follower节点 一 部署 leader节点 redis leader yaml apiVersion v1 kind Service metadata name redis leader
  • IDEA创建Web Project图解

    截图方式全程演示如何使用IntelliJ IDEA创建一个Web Project 以及如何部署到Tomcat 如何打成war包 详细请看截图 虽然没多少文字全是截图 但该有的文字说明截图上也有 如果还有什么疑问 请加裙交流
  • bfs 解决最短路问题

    前提 边权都一样时 才能用bfs求最短路 问题 给定一个 n mn m 的二维整数数组 用来表示一个迷宫 数组中只包含 00 或 11 其中 00 表示可以走的路 11 表示不可通过的墙壁 最初 有一个人位于左上角 1 1 1 1 处 已知
  • C\C++_构造函数和析构函数

    文章目录 1 系统提供构造函数规则 1 1 代码示例 2 默认构造函数 3 拷贝构造函数 3 1 深拷贝和浅拷贝 3 2 调用拷贝构造的时机 4 带参构造函数 4 1 带单个参数 5 不使用拷贝构造和拷贝赋值运算符 5 1 方法一 5 2
  • 基础算法题——德邦国王(dfs、剪枝)

    德邦国王 题目还算中规中矩 就是剪枝比较麻烦 解题思路 dfs 剪枝 移动次数不超过设定值 M 若有解 则后面的步骤不可大于该解的值 不断查询完美矩阵与当前矩阵不同的个数 t t 1 为最快可将当前矩阵移动成完美矩阵的步数 若 t 1 已经