牛客——牛可乐的翻转游戏(状压,dfs)

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

牛可乐发明了一种新型的翻转游戏!

在一个有 nnn 行 mmm 列的棋盘上,每个格子摆放有一枚棋子,每一枚棋子的颜色要么是黑色,要么是白色。每次操作牛可乐可以选择一枚棋子,将它的颜色翻转(黑变白,白变黑),同时将这枚棋子上下左右相邻的四枚棋子的颜色翻转(如果对应位置有棋子的话)。

牛可乐想请你帮他判断一下,能否通过多次操作将所有棋子都变成黑色或者白色?如果可以,最小操作次数又是多少呢?

输入描述:

第一行两个整数 n,m(1≤n≤100,1≤m≤10)n,m(1\leq n\leq 100,1\leq m\leq 10)n,m(1≤n≤100,1≤m≤10),代表棋盘的行数和列数。

之后 nnn 行,每行 mmm 个数字,第 iii 个数字如果为 000 ,代表对应位置的棋子为白色,如果为 111 则为黑色。

输出描述:

如果无法将所有棋子变成一个颜色,输出 "Impossible"(不含引号),否则输出变成一个颜色的最小操作次数。

#include<bits/stdc++.h>
using namespace std;

int n, m;
string c[120], d[120];

void overturn(int x, int y) {
    int dx[6] = {0, 0, 0, 0, 1, -1};
    int dy[6] = {0, 0, 1, -1, 0, 0};
    
    for (int i = 1; i <= 5; i++) {
        int a = x + dx[i];
        int b = y + dy[i];
        
        if (a >= 0  && b >= 0 ) {
            d[a][b] = (d[a][b] == '0' ? '1' : '0');
        }
    }
}

int recurrence(int state, char target) {
    int step = 0;
    
    for (int i = 0; i < n; i++) {
        d[i] = c[i];
    }
    
    for (int i = 0; i < m; i++) {
        if (state & (1 << i)) {
            step++;
            overturn(0, i);
        }
    }
    
    for (int i = 1; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (d[i-1][j] != target) {
                step++;
                overturn(i, j);
            }
        }
    }
    
    for (int i = 0; i < m; i++) {
        if (d[n-1][i] != target) {
            return 1000;
        }
    }
    
    return step;
}

int main() {
    cin >> n >> m;
    
    for (int i = 0; i < n; i++) {
        cin >> c[i];
    }
    
    int ans = 1000;
    
    for (int i = 0; i < (1 << m); i++) {
        ans = min(ans, recurrence(i, '0'));
        ans = min(ans, recurrence(i, '1'));
    }
    
    if (ans == 1000) {
        cout << "Impossible";
    } else {
        cout << ans;
    }
    
    return 0;
}
#include<iostream>
using namespace std;
const int N=105,M=1200;
int a1[N],a2[N],cnt[M],n,m;

void Init(){
	for(int i=0;i<M;++i){
		for(int j=0;j<m;++j){
			if(i&(1<<j)) ++cnt[i];
		}
	}
}


int dfs(int pre,int op,int *a){
	int res=0;
	for(int i=1;i<n;++i){
		res+=cnt[pre];
		int cur=( (pre^(pre<<1)^(pre>>1)^op)&( (1<<m)-1) )^a[i];
		op=pre;	
		pre=cur;
	}
	if(pre==0) return res;
	else return 1e9;
	
}


int main(){
	char num;
	cin>>n>>m;
	Init();
	
	for(int i=0;i<n;++i){
		for(int j=1;j<=m;++j){
			cin>>num;
			if(num=='1') a1[i]|=1<<(m-j);
			else a2[i]|=1<<(m-j);
		}
	}
	//for(int i=0;i<n;++i) cout<<a1[i]<<" "<<a2[i]<<endl;
	int res=1e9;
	for(int i=0;i<(1<<m);++i){
		res=min(res,cnt[i]+dfs(( (i^(i<<1)^(i>>1))&( (1<<m)-1) )^a1[0] ,i,a1));
		res=min(res,cnt[i]+dfs(( (i^(i<<1)^(i>>1))&( (1<<m)-1) )^a2[0] ,i,a2));
	}
	if(res==1e9) cout<<"Impossible";
	else cout<<res;
	return 0;
}
#include <iostream>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
int change[120];
int map[120];
int m,n;
int wei(int num){
	int sum=0;
	while(num){
		sum++;
		num&=num-1;
	}
	return sum;
}
int wei(int a[]){
	int step=0x3f3f3f;
	for(change[0]=0;change[0]<(1<<m);change[0]++){
		map[0]=a[0];
		int sum=0;
		for(int j=0;j<n;j++){
			sum+=wei(change[j]);
			map[j]=map[j]^change[j]^((change[j]<<1)&((1<<m)-1))^(change[j]>>1);
			map[j+1]=a[j+1]^change[j];
			change[j+1]=map[j];
		}
		if(!map[n-1])step=min(sum,step);
	}
	return step;
}
int main() {
	int a[120];
	int b[120];
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	cin>>n>>m;
	char d;
	getchar(); 
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			d=getchar();
			d=='0'?a[i]=a[i]|(1<<j):b[i]=b[i]|(1<<j);
		}
		getchar();
	}
	int ans=0x3f3f3f;
	ans=min(wei(a),wei(b));
	if(ans>m*n)cout<<"Impossible"<<endl;
	else cout<<ans<<endl;
	return 0;
}

这种题好难理解呀,搜了好多题解,感觉懂了,但是再遇到也不一定会写,所以这种题还是先放一放吧。

补充:

状压是一种常用于位运算的技巧,用于表示和处理集合等离散对象的状态。它通过使用整数的二进制位来表示对象或状态的某些特征,以达到节省空间和提高效率的目的。

在状压中,通常使用整数的二进制位来表示某个集合的状态,其中每一位可以表示集合中的某个元素是否存在或某个状态是否满足某种条件。例如,对于一个大小为n的集合,可以使用一个n位的整数来表示集合的状态,其中每一位表示集合中对应元素的存在与否。

状压常用于解决组合数学、动态规划、图论等问题,特别是当集合的大小较小且需要频繁判断和操作集合的状态时,状压可以显著提高算法的效率和减少空间复杂度。

使用状压技巧需要熟悉位运算的基本操作,例如与(&)、或(|)、异或(^)等,以及位移操作(<<、>>)等。同时,也需要注意处理位运算可能导致的溢出和边界情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/373979.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CentOS 8 安装配置 Hadoop3.3.6 伪分布式安装方式(适用于开发和调试)

1.配置服务器ssh免密登录&#xff0c;否则后面启动会报错&#xff1a;尝试通过SSH连接到主机出现认证错误的提示 配置服务器ssh免密登录&#xff1a; 1.生成SSH密钥对&#xff08;如果尚未生成&#xff09;&#xff1a; 执行下面的命令生成密钥对&#xff0c;一直回车即可 ssh…

Intellij Idea的数据库工具 DataGrip

DataGrip DataGrip&#xff1a; IDEA自带&#xff0c;非常好用。智能提示很强大&#xff0c;快捷键跟IDEA自身一致。 如果下载不了 DataGrip&#xff0c;也可以直接用 IDEA 自带的。 常用的快捷键 alt8&#xff1a; 打开数据库Service ctrlshiftF10&#xff1a;打开常用的数…

记一次CPU有规律飙高的线上问题排查过程

一、背景 最近在计费系统模块和灰度发布相关的功能已经基本交付,在这个间隙中,领导说有个线上问题需要排查下, 问题的场景比较有意思,排查过程中也有一些成长,这里记录一下。 二、排查过程 2.1 查看pinpoint 监控 首先根据领导的反馈看pinpoint中的JVM的CPU日志: CP…

基于Vue2用keydown、setTimeout事件实现连续按键(连击)任意键(或组合键)3秒触发自定义事件(以F1键为例)

核心代码 <template></template> <script> export default {created() {//监听弹起快捷键addEventListener("keyup", this.keyup);},destroyed(d) {//移除监听弹起快捷键removeEventListener("keyup", this.keyup);},methods: {keyup(…

ES节点故障的容错方案

ES节点故障的容错方案 1. es启动加载逻辑1.1 segment和translg组成和分析1.2 es节点启动流程1.3 es集群的初始化和启动过程 2. master高可用2.1 选主逻辑2.1.1 过滤选主的节点列表2.1.2 Bully算法2.1.2 类Raft协议2.1.3 元数据合并 2.2 HA切换 3. 分片高可用3.1 集群分片汇报3.…

2.0 Zookeeper 安装配置

Linux 安装 zookeeper 下载地址为: Apache ZooKeeper。 选择一稳定版本&#xff0c;本教程使用的 release 版本为3.4.14&#xff0c;下载并安装。 打开网址 https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz&#xff0c;看到如下界…

HTTP1.1、HTTP2、HTTP3

HTTP1.1 HTTP/1.1 相比 HTTP/1.0 性能上的改进&#xff1a; 使用长连接的方式改善了 HTTP/1.0 短连接造成的性能开销。支持管道&#xff08;pipeline&#xff09;网络传输&#xff0c;只要第一个请求发出去了&#xff0c;不必等其回来&#xff0c;就可以发第二个请求出去&…

函数的连续与间断【高数笔记】

【连续】 分类&#xff0c;分几个&#xff1f;每类特点&#xff1f; 连续条件&#xff0c;是同时满足还是只需其一&#xff1f; 【间断】 分类&#xff0c;分几个大类&#xff0c;又分几个小类&#xff1f;每类特点&#xff1f; 间断条件&#xff0c;是同时满足还是只需其一&am…

Msql-数据库死锁

实验案例 CREATE TABLE t1_deadlock ( id int(11) NOT NULL, name varchar(100) DEFAULT NULL, age int(11) NOT NULL, address varchar(255) DEFAULT NULL, PRIMARY KEY (id), KEY idx_age (age) USING BTREE, KEY idx_name (name) USING BTREE ) ENGINEInnoDB DEFAULT CHARS…

Unity类银河恶魔城学习记录1-14 AttackDirection源代码 P41

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili PlayerPrimaryAttackState.cs using System.Collections; using System.Co…

计算机毕业设计 | SSM 医药信息管理系统(附源码)

1&#xff0c; 概述 1.1 课题背景 本系统由说书客面向广大民营药店、县区级医院、个体诊所等群体的药品和客户等信息的管理需求&#xff0c;采用SpringSpringMVCMybatisEasyui架构实现&#xff0c;为单体药店、批发企业、零售连锁企业&#xff0c;提供有针对性的信息数据管理…

OPC UA 信息模型云库简介

OPC基金会宣布推出与清洁能源和智能制造创新研究所&#xff08;CESMII&#xff09;共同开发的全球可用的UA云库。凭借其多云架构&#xff0c;UA 云库见证了所有主要云供应商利用开放接口的贡献&#xff0c;并可用于共享、查找和协作 OPC UA 信息模型。如今&#xff0c;UA云库已…

vue2.0+使用md-edit编辑器

前言&#xff1a;小刘开发过程中&#xff0c;如果是博客项目一般是会用到富文本。众多富文本中&#xff0c;小刘选择了markdown&#xff0c;并记录分享了下来。 # 使用 npm npm i kangc/v-md-editor -Smain.js基本配置import VueMarkdownEditor from kangc/v-md-editor; import…

【AI绘画+Midjourney平替】Fooocus:图像生成、修改软件(Controlnet原作者重新设计的UI+Windows一键部署)

代码&#xff1a;https://github.com/lllyasviel/Fooocus windows一键启动包下载&#xff1a;https://github.com/lllyasviel/Fooocus/releases/download/release/Fooocus_win64_2-1-831.7z B站视频教程&#xff1a;AI绘画入门神器&#xff1a;Fooocus | 简化SD流程&#xff0c…

国内唯一!通义灵码入选全球智能编码助手使用率 TOP 榜单

近日&#xff0c;在国内知名科技媒体 InfoQ 研究中心发布的《中国软件技术发展洞察和趋势预测报告 2024》中提到&#xff0c;随着 AI 和大模型技术的普及&#xff0c;开发者智能编码助手的使用习惯已经养成&#xff0c;其中&#xff0c;开发者使用的智能编码助手产品使用率超过…

【网络安全】URL解析器混淆攻击实现ChatGPT账户接管、Glassdoor服务器XSS

文章目录 通配符URL解析器混淆攻击实现ChatGPT账户接管通配符URL解析器混淆攻击实现Glassdoor服务器缓存XSS 本文不承担任何由于传播、利用本文所发布内容而造成的任何后果及法律责任。 本文将基于ChatGPT及Glassdoor两个实例阐发URL解析器混淆攻击。 开始本文前&#xff0c;…

SpringCloud-搭建Nacos服务中心

Nacos 是一个开源的动态服务发现、配置管理和服务管理平台。它支持多种服务发现协议&#xff0c;包括基于 DNS 和 HTTP 的服务发现。Nacos 提供了强大的配置管理和服务发现功能&#xff0c;使得在微服务架构中轻松实现服务注册、发现和配置管理成为可能。在本篇博客中&#xff…

亚信安慧AntDB推动数据库自主可控

亚信安慧AntDB正致力于验证数据库软硬件全自主可控的可行性&#xff0c;并将其应用于运营商核心的交易场景&#xff0c;以替代国外商业解决方案。为了实现这一目标&#xff0c;亚信安慧AntDB的研发团队不断进行技术创新和实践探索。 该数据库以自主研发的技术为基础&#xff0…

在 CentOS 7上使用 Apache 和 mod_wsgi 部署 Django 应用的方法

简介 Django 是一个强大的 Web 框架&#xff0c;可以帮助您快速启动 Python 应用程序或网站。Django 包括一个简化的开发服务器&#xff0c;用于在本地测试代码&#xff0c;但对于任何与生产相关的事情&#xff0c;都需要一个更安全和功能强大的 Web 服务器。 在本指南中&…

GPTs保姆级教程之实践

GPTs什么 使用GPTs的前提&#xff1a;ChatGPT Plus帐号 GTPs的作用&#xff1a;把我们和GPT对话的prompt&#xff0c;封装起来成为一个“黑匣子”。 主要有两个作用&#xff1a; 1、避免反复输入prompt&#xff0c;“黑匣子”打开&#xff0c;输入问题即可使用 2、在别人可以…