/*
分析:
15MS,还上第一版了-、-I,不过代码敲得自己都觉得恶心。。。
简单说下思路,代码还是别看了-、-I:
初始赋值ans=n*m,既取消了n*m个点,然后看看哪些点被多
取消了,再让ans--就行了。(不过这个判断要准了,比如当前边
和前面的x条边都相交与同一点,那么ans只--一次)
2012-10-08
*/
分析:
15MS,还上第一版了-、-I,不过代码敲得自己都觉得恶心。。。
简单说下思路,代码还是别看了-、-I:
初始赋值ans=n*m,既取消了n*m个点,然后看看哪些点被多
取消了,再让ans--就行了。(不过这个判断要准了,比如当前边
和前面的x条边都相交与同一点,那么ans只--一次)
2012-10-08
*/
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
struct A
{
int x,y,z;
int flag;
}eage[1011];
struct B
{
int x,y,z;
}dot[1011];
int cmp(const void *a,const void *b)
{
struct B *c,*d;
c=(struct B *)a;
d=(struct B *)b;
if(c->x!=d->x) return c->x-d->x;
else if(c->y!=d->y) return c->y-d->y;
else return c->z-d->z;
}
int main()
{
int T;
int n,m;
int i,l;
char c1,c2;
int a,b;
int x_t,y_t,z_t,temp,flag;
int ans;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
getchar();
for(i=0;i<m;i++)
{
scanf("%c=%d,%c=%d",&c1,&a,&c2,&b);
getchar();
if(c1=='X')
{
if(c2=='Y') eage[i].x=a,eage[i].y=b,eage[i].z=-1;
else eage[i].x=a,eage[i].y=-1,eage[i].z=b;
}
else if(c1=='Y')
{
if(c2=='X') eage[i].x=b,eage[i].y=a,eage[i].z=-1;
else eage[i].x=-1,eage[i].y=a,eage[i].z=b;
}
else if(c1=='Z')
{
if(c2=='Y') eage[i].x=-1,eage[i].y=b,eage[i].z=a;
else eage[i].x=b,eage[i].y=-1,eage[i].z=a;
}
if(a<=0 || a>n || b<=0 || b>n) eage[i].flag=1;
}
ans=n*m;
if(eage[0].flag) ans-=n;
for(i=1;i<m;i++)
{
if(eage[i].flag) {ans-=n;continue;}
flag=0;
temp=0;
for(l=0;l<i;l++)
{
if(eage[i].flag) continue;
if(eage[i].x==eage[l].x && eage[i].y==eage[l].y && eage[i].z==eage[l].z) {flag=1;break;}
else if(eage[i].x==eage[l].x && eage[i].x!=-1)
{
if(eage[i].z==-1 && eage[l].y==-1)
{
dot[temp].x=eage[i].x;
dot[temp].y=eage[i].y;
dot[temp].z=eage[l].z;
temp++;
}
else if(eage[i].y==-1 && eage[l].z==-1)
{
dot[temp].x=eage[i].x;
dot[temp].y=eage[l].y;
dot[temp].z=eage[i].z;
temp++;
}
}
else if(eage[i].y==eage[l].y && eage[i].y!=-1)
{
if(eage[i].z==-1 && eage[l].x==-1)
{
dot[temp].y=eage[i].y;
dot[temp].x=eage[i].x;
dot[temp].z=eage[l].z;
temp++;
}
else if(eage[i].x==-1 && eage[l].z==-1)
{
dot[temp].y=eage[i].y;
dot[temp].x=eage[l].x;
dot[temp].z=eage[i].z;
temp++;
}
}
else if(eage[i].z==eage[l].z && eage[i].z!=-1)
{
if(eage[i].x==-1 && eage[l].y==-1)
{
dot[temp].z=eage[i].z;
dot[temp].y=eage[i].y;
dot[temp].x=eage[l].x;
temp++;
}
else if(eage[i].y==-1 && eage[l].x==-1)
{
dot[temp].z=eage[i].z;
dot[temp].y=eage[l].y;
dot[temp].x=eage[i].x;
temp++;
}
}
}
if(flag) ans-=n;
else
{
if(temp==0) continue;
qsort(dot,temp,sizeof(dot[0]),cmp);
ans--;
for(l=1;l<temp;l++)
{
if(dot[l].x==dot[l-1].x && dot[l].y==dot[l-1].y && dot[l].z==dot[l-1].z) continue;
else ans--;
}
}
}
printf("%d\n",ans);
}
return 0;
}