CCF认证2015122-消除类游戏

本文介绍了一种使用C++编程语言消除二维数组中连续重复元素的方法。通过按行和列扫描数组,找到连续重复三次及以上的元素,并将其标记为0。此过程涉及创建一个二维向量来存储原始数据,另一个向量用于存储应被清除的元素的坐标。

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

本人初学,水平有限,若有不足,恳请赐教!

本题思路是按行和列分两次进行相邻数据比对,如果满足要求,则将其坐标记录。然后将坐标对应数值变为0即可。

具体代码如下:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
	//FILE *stream;
	//freopen_s(&stream, "data.txt", "r", stdin);

	int n, m;
	cin >> n >> m;
	vector<vector<int>> map(n);
	vector<pair<int,int>> mark;
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < m; j++)
		{
			int temp;
			cin >> temp;
			map[i].push_back(temp);
		}
	}
	for(int i = 0; i < n; i++) //按行比对
	{
		for(int j = 0, k; j < m - 2; j = k)
		{
			int same = 0;
			for(k = j; k < m; k++)
			{
				if(map[i][j] == map[i][k]) same++;
				else
				{
					if(same >= 3)
					{
						for(int l = j; l < k; l++) mark.push_back({i, l});
					}
					break;
				}
				if(k == m - 1 && same >= 3) //尾部处理
				{
					for(int l = j; l <= k; l++) mark.push_back({i, l});
				}
			}
		}
	}
	for(int j = 0; j < m; j++) //按列比对
	{
		for(int i = 0, k; i < n - 2; i = k)
		{
			int same = 0;
			for(k = i; k < n; k++)
			{
				if(map[i][j] == map[k][j]) same++;
				else
				{
					if(same >= 3)
					{
						for(int l = i; l < k; l++) mark.push_back({l, j});
					}
					break;
				}
				if(k == n - 1 && same >= 3)
				{
					for(int l = i; l <= k; l++) mark.push_back({l, j});
				}
			}
		}
	}
	for(auto e : mark)
	{
		map[e.first][e.second] = 0;
	}
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < m; j++)
		{
			cout << map[i][j] << ' ';
		}
		cout << endl;
	}

	//fclose(stream);

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值