L1-7 机工士姆斯塔迪奥

发布时间 2023-03-28 11:40:14作者: Jinx8823

这道题有两种思路,先说第一种:

这种思路比较容易想到,就是直接用一个二维数组来进行标记,被击中的格子就记为1,没被击中就为0,最后计算没被击中的格子数量就可以

#include<iostream>
using namespace std;	
int main()
{
	int m,n,q,t,c;
	scanf("%d%d%d",&n,&m,&q);
	int a[n+1][m+1]={0};
	for(int i=1;i<=q;i++){
		//TODO
		scanf("%d%d",&t,&c);
		if(t==0)
		{
			for(int j=1;j<=m;j++)
			{
				a[c][j]=1;
			}
		}
		else
		{
			for(int k=1;k<=n;k++)
			{
				a[k][c]=1;
			}
		}
	}
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(a[i][j]==0)
				ans++;
		}
	}
	printf("%d",ans);
	return 0;
}

因为这样写一个二维数组,写一个二重for循环复杂度可能会很高,所以就想着降低一下循环次数,想着能够减小一点复杂度

第二种思路:

就写两个一维数组分别代表行和列,初值赋为0,代表该行或列没有被击中过,如果击中了,就将该行或列的值改为1,并且行的数量或者列的数量-1,最后(行*列)就是最终未被击中的格子数量

#include<cstdio>
using namespace std;	
int main()
{
	int n,m,q,t,c;
	scanf("%d%d%d",&n,&m,&q);
	int row[n+1]={0},col[m+1]={0};
	for(int i=1;i<=q;i++){
		//TODO
		scanf("%d%d",&t,&c);
		if(t==0)
		{
			if(row[c]==0)
			{
				row[c]=1;
				n--;
			}
		}
		else
		{
			if(col[c]==0)
			{
				col[c]=1;
				m--;
			}
		}
	}
	printf("%d",n*m);
	return 0;
}