1815:画家问题 (dfs java)

2023-10-12 07:50
文章标签 java 问题 dfs 画家 1815

本文主要是介绍1815:画家问题 (dfs java),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接
在这里插入图片描述
在这里插入图片描述
和熄灯问题很像。如果暴力搜索的话,棋盘大小15*15,每个位置的状态有两个变或者不变,那么将有 2 15 ∗ 15 2^{15*15} 21515个状态,显然不能直接搜。事实上,我们可以枚举第一行的状态,因为第一行的状态一旦确定,剩余行也随之确定,这是因为对于与第一行的w,只能是第二行的这个位置修改才能使得第一行的‘w’变为’y’,其他行的修改不会影响到第一行,同理,第二行确定后,只能由第三行改变第二行为‘w’的位置。最后只需要检查最后一行是否都为‘y’即可。
所以枚举第一行的状态就只有 2 16 2^{16} 216个状态了。
需要注意的是,要及时恢复棋盘原来的状态,这一点在枚举第一行状态的时候很容易想到,但是当枚举完第一行状态进行check是否是可行的方案时,需要重新建立一个棋盘的副本去检查,因为检查的过程也涉及到颜色的改变,检查完毕之后接着dfs应该用的是原来的棋盘。

import java.util.*;public class Main{public static char[][] G=new char[16][16];public static int[] dx= {0,0,-1,1};public static int[] dy= {-1,1,0,0};public static int ans=0x3f3f3f3f;public static Map<Character,Character> mp=new HashMap<Character,Character>();public static void change(int x,int y,int n,char[][] g) {//改变(x,y)及上下左右的颜色//change两次就相当于没有changeg[x][y]=mp.get(g[x][y]);for(int i=0;i<4;i++) {int newx=x+dx[i];int newy=y+dy[i];if(newx<0 || newx>=n || newy<0 || newy>=n) {continue;}g[newx][newy]=mp.get(g[newx][newy]);}}public static int check(char[][]tmpG,int n) {//根据第一行的状态改变剩余行的状态int cnt=0;for(int i=1;i<n;i++) {for(int j=0;j<n;j++) {if(tmpG[i-1][j]=='w') {cnt++;change(i,j,n,tmpG);}}}for(int j=0;j<n;j++) {if(tmpG[n-1][j]=='w') {return 0x3f3f3f3f;}}return cnt;}public static void dfs(int pos,int n,int CNT) {//当前位置pos有两种状态,改/不改if(pos==n) {//第一行的状态枚举完毕,检查是否都变为黄色char[][] tmpG=new char[16][16];for(int i=0;i<n;i++) {for(int j=0;j<n;j++) {tmpG[i][j]=G[i][j];}}ans=Math.min(check(tmpG,n)+CNT,ans);return;//递归终止之后记得返回,否则还会执行后面}change(0,pos,n,G);//改dfs(pos+1,n,CNT+1);change(0,pos,n,G);//撤销改,即不改dfs(pos+1,n,CNT);}public static void main(String[] Args) {mp.put('w', 'y');mp.put('y', 'w');Scanner sc=new Scanner(System.in);int n;n=sc.nextInt();sc.nextLine();//吸收enterfor(int i=0;i<n;i++) {String tmp;tmp=sc.nextLine();for(int j=0;j<n;j++) {G[i][j]=tmp.charAt(j);}}//枚举第一行的状态,每个位置可以变或者不变//第一行状态选定后,其他行的状态就随之确定了dfs(0,n,0);if(ans==0x3f3f3f3f) {System.out.print("inf");}else {System.out.print(ans);}
//		for(int i=0;i<n;i++) {
//			for(int j=0;j<n;j++) {
//				System.out.print(G[i][j]+" ");
//			}
//			System.out.println();
//		}}
}

这篇关于1815:画家问题 (dfs java)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick