13 |偶数矩阵

一、核心思路

对于每组测试数据,通过二进制枚举第一行的所有可能状态并判断其是否合法,根据偶数矩阵的性质来依次递推后面行的最终状态,同时判断其是否合法,若合法并统计改变元素的次数。

二、代码实现

cpp 复制代码
int T;
const int N = 20;
int a[N], b[N], n;
// 判断是否合法,并且计算0->1变化的次数 
int exam(int x, int y)
{
	int sum = 0;
	for (int i = 0; i < n; i++)
	{
		int m = (x >> i) & 1;
		int n = (y >> i) & 1;
		if (m == 1 && n == 0) return -1;
		if (m == 0 && n == 1) sum++;
	 } 
	return sum;
}
int solve()
{
	int ret = 0x3f3f3f3f;
	//枚举第一行的最终状态
	for (int i = 0; i < (1 << n); i++) 
	{
		// 备份初始数组
		memcpy(b, a, sizeof a);
		int change = i;
		int cnt = 0;
		bool flag = 1;
		for (int j = 1; j <= n; j++)
		{
			// 检查该行的合法性 
			int tmp = exam(b[j], change);
			if (tmp == -1)
			{
				flag = 0;
				break;
			}
			else cnt += tmp;
			// 更新当前行的状态
			b[j] = change; 
			// 下一行的状态
			change = (b[j] << 1) ^ (b[j] >> 1) ^ b[j-1];
			change &= ((1 << n) - 1); // 消除干扰 
		 } 
		 if(flag) ret = min(ret, cnt);
	}
	 if (ret == 0x3f3f3f3f) return -1;
	 else return ret; 
 } 
int main ()
{
	cin >> T;
	for (int t = 1; t <= T; t++)
	{
		// 多组数据,进行初始化
		memset(a, 0, sizeof a); 
		cin >> n;
		// 存储初始数据 
		for(int i = 1; i <= n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				int x; cin >> x;
				a[i] |= (x << j);
			}
		}
		cout << "Case " << t << ": " << solve() << endl;
	}
	return 0;
}
相关推荐
小猪佩奇TONY10 分钟前
Linux 内核学习(19) --- linux swap 机制
linux·学习·swap·kswapd
努力努力再努力wz19 分钟前
【C++ 高阶系列】C++ 高性能网络编程:当 Reactor 遇见协程:从 epoll 回调到异步 MySQL,彻底打通任务挂起与恢复
网络·c++·mysql
晒太羊的猫29 分钟前
hot100子串
java·算法·leetcode
andrsted31 分钟前
企业培训时间难统一?练题簿让在线免费刷题与培训考核更好安排
学习·微信小程序·小程序·学习方法·刷题
李航198335 分钟前
虚拟盖房子,在游戏中学习房子的建造过程
人工智能·学习·游戏·计算机视觉·ai编程
霍霍的袁1 小时前
【C++11】左值右值引用与移动语义详细笔记(左值右值、右值引用、移动构造、移动赋值、引用折叠、万能转发)
c++·笔记·学习·visual studio
MandalaO_O1 小时前
SpringMVC 异常处理 & 拦截器
笔记
布莱克6051 小时前
C++ 中 unordered_set 与 unordered_map 有什么不同?一篇讲透
开发语言·c++·哈希
小豆庄1 小时前
视频脱敏引擎的追踪难题:转场误判定、ID撞号和淡入窗口
qt·算法·目标检测·音视频·视频·敏捷流程
外收内放1 小时前
FastAPI猜字谜实战(6):日志与异常
开发语言·python·学习·fastapi