题意:
给一个n*n*n的立方体,之后的m行给出两个坐标,要删除该线上的小立方体,问经过m次操作后,一共删除了多少个立方体块。
输入:
2 3 2 Y=1,Z=3 X=3,Y=1 10 2 X=3,Y=3 Y=3,Z=3
输出:
5 19
分析:
标记去重,将m次操作用数组来标记,每次操作都用数组visxy[]或者visxz[]或者visyz[]来进行标记,遍历一个操作的一整排,将被这
三个标记数组标记过得数量统计下来ans即:重复统计的小立方块,之后用n*m-ans就是删除的那些。
代码:
#include <cstdio>
#include <cstring>
using namespace std;
int visxy[1005][1005],visxz[1005][1005],visyz[1005][1005];
long long ans=0;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m,v1,v2;
scanf("%d%d ",&n,&m);
ans=0;
char c1,c2;
memset(visxy,0,sizeof(visxy));
memset(visxz,0,sizeof(visxz));
memset(visyz,0,sizeof(visyz));
for(int i=0;i<m;i++)
{
scanf("%c=%d,%c=%d ",&c1,&v1,&c2,&v2);
if((c1=='X'&&c2=='Y')||(c1=='Y'&&c2=='X'))
{
for(int i=1;i<=n;i++)
{
if(visxz[v1][i]||visyz[v2][i]||visxy[v1][v2])
ans++;
}
visxy[v1][v2]=1;
}
else if((c1=='X'&&c2=='Z')||(c1=='Z'&&c2=='X'))
{
for(int i=1;i<=n;i++)
{
if(visxy[v1][i]||visyz[i][v2]||visxz[v1][v2])
ans++;
}
visxz[v1][v2]=1;
}
else if((c1=='Y'&&c2=='Z')||(c1=='Z'&&c2=='Y'))
{
for(int i=1;i<=n;i++)
{
if(visxz[i][v2]||visxy[i][v1]||visyz[v1][v2])
ans++;
}
visyz[v1][v2]=1;
}
}
printf("%I64d\n",n*m-ans);
}
return 0;
}