这道题有两种思路,先说第一种:
这种思路比较容易想到,就是直接用一个二维数组来进行标记,被击中的格子就记为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;
}