版权声明:哈哈哈哈哈哈哈哈哈哈哈哦吼~~ https://blog.csdn.net/threeh20/article/details/83240596
http://acm.hdu.edu.cn/showproblem.php?pid=5961
传递关系 存在a->b b->c则定存在a->c
#include<bits/stdc++.h>
using namespace std;
vector<int>p1[3333];
vector<int>p2[3333];
char ma[3333][3333];
int main(){
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
char s[3333];
for(int i=1;i<=n;i++)
{
p1[i].clear();
p2[i].clear();
}
for(int i=0;i<n;i++)
{
scanf("%s",ma[i]);
for(int j=0;j<n;j++)
{
if(ma[i][j]=='P')
{
p1[i+1].push_back(j+1);
}
if(ma[i][j]=='Q')
{
p2[i+1].push_back(j+1);
}
}
}
int f1=0;
int f2=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<p1[i].size();j++)
{
for(int k=0;k<p1[p1[i][j]].size();k++)
{
if(ma[i-1][p1[p1[i][j]][k]-1]!='P')
{
f1=1;
break;
}
}
if(f1)break;
}
if(f1)break;
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<p2[i].size();j++)
{
for(int k=0;k<p2[p2[i][j]].size();k++)
{
if(ma[i-1][p2[p2[i][j]][k]-1]!='Q')
{
f2=1;
break;
}
}
if(f2)break;
}
if(f2)break;
}
if(!f1&&!f2)
{
cout<<"T"<<endl;
}
else cout<<"N"<<endl;
}
return 0;
}