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集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

浅析Java中如何优雅地处理null值

《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll

SpringBoot条件注解核心作用与使用场景详解

《SpringBoot条件注解核心作用与使用场景详解》SpringBoot的条件注解为开发者提供了强大的动态配置能力,理解其原理和适用场景是构建灵活、可扩展应用的关键,本文将系统梳理所有常用的条件注... 目录引言一、条件注解的核心机制二、SpringBoot内置条件注解详解1、@ConditionalOn

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

Spring LDAP目录服务的使用示例

《SpringLDAP目录服务的使用示例》本文主要介绍了SpringLDAP目录服务的使用示例... 目录引言一、Spring LDAP基础二、LdapTemplate详解三、LDAP对象映射四、基本LDAP操作4.1 查询操作4.2 添加操作4.3 修改操作4.4 删除操作五、认证与授权六、高级特性与最佳