200402题(生命游戏(位运算))

本文介绍了一种在不使用额外空间的情况下更新二维数组的解决方案,通过将每个元素视为32位int类型,利用未使用的位进行状态标记,实现了康威生命游戏的规则更新。这种方法巧妙地避免了额外的空间开销,展示了位操作的魅力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
一个 int 有 32 bit,输入数据只用了一个 bit,所以我们可以利用其他空闲的bit位进行“原地修改”。

class Solution {
public:
	void gameOfLife(vector<vector<int>>& board) {
		int dx[] = { 0,0,-1,1,-1,-1,1,1 };//上、下、左、右、左上、左下、右上、右下
		int dy[] = { 1,-1,0,0,1,-1,1,-1 };
		for (int i = 0; i < board.size(); i++)
			for (int j = 0; j < board[0].size(); j++)
			{
				int count_alive = 0;
				for (int k = 0; k < 8; k++)
				{
					int new_x = i + dx[k];
					int new_y = j + dy[k];
					if (!(new_x >= 0 && new_x < board.size() && new_y >= 0 && new_y < board[0].size()))continue;

					if ((board[new_x][new_y] & 1) == 1)//只判断第一个bit!!!很关键// 这里不能直接加board[x][y],因为 board[x][y] 的第二个bit是可能有值的
						count_alive += (board[new_x][new_y] & 1);//只累加第一个bit!!!很关键


				}
				if (count_alive < 2 && board[i][j] == 1)
				{
					board[i][j] |= 0; //第二个bit为0
				}
				else if ((count_alive == 2 || count_alive == 3) && board[i][j] == 1)
				{
					board[i][j] |= 2;//使第二个bit为1
				}
				else if (count_alive > 3 && board[i][j] == 1)
				{
					board[i][j] |= 0;//使第二个bit为0
				}
				else if (count_alive == 3 && board[i][j] == 0)
				{
					board[i][j] |= 2;//使第二个bit为1
				}


			}
		for (int i = 0; i < board.size(); i++)
			for (int j = 0; j < board[0].size(); j++)
			{
				board[i][j] >>= 1;//数组的所有元素同时右移1位,是原来的第二个bit成为第一个bit
			}

	}
};

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值