CSP CCF 201512-2 消除类游戏 C++满分题解

解题思路:

1.用两个矩阵来存储 原始值,其中一个永远不改变,只用来判断 ,这样可以防止消除某一行或某一列后影响其它行或列

2.记录下每一行每个数字出现的次数和每一列每一个数字出现的次数。

3.只有当某一行或某一列的某个数出现次数大于等于3,才需要判断是否需要消除,否则直接跳过。

4.每一行和每一列需要消除的地方可能不止一处,需要进行多次判断。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

int main()
{
	int n,m;
	cin>>n>>m;
	int arr[31][31]={0};  //只用来判断,永远不改变
	int arr2[31][31];      //用来输出,防止消除一次后,某一个数变成0,影响其它行列
	int visith[31][10]={0};   //标记数组,记录每一行每个取值有几个
	int visitl[31][10]={0};   //标记数组,记录每一列每个取值有几个
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			cin>>arr[i][j];
			arr2[i][j]=arr[i][j];
			visith[i][arr[i][j]]++;
			visitl[j][arr[i][j]]++;
		}
	}
	for(int i=0;i<n;i++)
	{
		for(int j=1;j<10;j++)
		{
			if(visith[i][j]>=3)  //只有大于等于3,才需要判断
			{
				int t=0;   //计算有几个等于j的数
				int pos=0;   //开始消除的位置
				for(int k=0;k<m;k++)
				{
					if(arr[i][k]==j)    
					{
						t++;
					}
					if(t>=3&&(arr[i][k]!=j||k==m-1))   //需要消除的条件
					{
						for(int tm=pos;tm<k;tm++)  //修改第二个矩阵,第一个矩阵永远不变
						{
							arr2[i][tm]=0;
						}
						if(arr[i][k]==j)   //最后一个位置要额外判断
						    arr2[i][k]=0;
						pos=k+1;   //需要消除的位置更新
						t=0;     //值等于j的个数重新为0
						continue;  //开始下一次循环
					}
					if(arr[i][k]!=j)  //其它情况
					{
						t=0;
						pos=k+1;
					}
				}
			}
		}
	}
	for(int i=0;i<m;i++)  //判断每一列时也一样
	{
		for(int j=1;j<10;j++)
		{
			if(visitl[i][j]>=3)
			{
				int t=0;
				int pos=0;
				for(int k=0;k<n;k++)
				{
					if(arr[k][i]==j)
					{
						t++;
					}
					if(t>=3&&(arr[k][i]!=j||k==n-1))
					{
						for(int tm=pos;tm<k;tm++)
						{
							arr2[tm][i]=0;
						}
						pos=k+1;
						t=0;
						if(arr[k][i]==j)
						    arr2[k][i]=0;
						continue;
					}
					if(arr[k][i]!=j)
					{
						t=0;
						pos=k+1;
					}
				}
			}
		}
	}
	for(int i=0;i<n;i++)  //输出第二个矩阵
	{
		for(int j=0;j<m;j++)
		{
			cout<<arr2[i][j]<<' ';
		}
		cout<<endl;
	}
	return 0;
}
相关推荐
闻缺陷则喜何志丹11 分钟前
【剪枝 贪心 回溯】B4093 [CSP-X2021 山东] 发送快递|普及+
c++·算法·剪枝·贪心·洛谷
猫头虎29 分钟前
HAMi 2.7.0 发布:全面拓展异构芯片支持,优化GPU资源调度与智能管理
嵌入式硬件·算法·prompt·aigc·embedding·gpu算力·ai-native
漫漫不慢.32 分钟前
算法练习-二分查找
java·开发语言·算法
如竟没有火炬1 小时前
LRU缓存——双向链表+哈希表
数据结构·python·算法·leetcode·链表·缓存
Greedy Alg1 小时前
LeetCode 236. 二叉树的最近公共祖先
算法
Maple_land1 小时前
Linux进程第八讲——进程状态全景解析(二):从阻塞到消亡的完整生命周期
linux·运维·服务器·c++·centos
爱吃生蚝的于勒1 小时前
【Linux】零基础学会Linux之权限
linux·运维·服务器·数据结构·git·算法·github
ajassi20001 小时前
开源 C++ QT QML 开发(十一)通讯--TCP服务器端
c++·qt·开源
lyp90h1 小时前
高效SQLite操作:基于C++模板元编程的自动化封装
c++
minji...2 小时前
Linux相关工具vim/gcc/g++/gdb/cgdb的使用详解
linux·运维·服务器·c++·git·自动化·vim