#11. 轮舞
轮舞
Description
小W办了一个有关舞蹈的节目,并用NNEZ的公款作为奖金引来了许多位选手来参与。
对于任意两名选手,他们之间都有一名选手喜欢另一名选手。遗憾的是,这种喜欢总是单向的,也就是说如果选手喜欢选手,那么选手就不会喜欢选手。
现在小W要举办期节目,第期节目有名选手报名,每期节目中需要有 3 名选手参与。在每期节目的最后,这些选手要一起表演轮舞,来凸显友谊第一,比赛第二的精神。为了让选手打消顾虑,小W要求在选出的选手中,每名选手都至少喜欢另外一名选手。
小W想知道,对于每期节目,有多少种选择选手的方式满足他的要求。然而他是第一次做这种工作,没有经验,所以他把任务交给了你。两种方案不同当且仅当有一位选手在一个方案中出现而在另一个方案中没有出现。
Format
Input
第一行输入一个整数,表示小W要举办的期数。
接下来是组输入,每组输入对应一期节目。
每组输入的第一行输入一个整数,表示这期节目中选手的数量。
接下来行,每行输入一个长为的字符串,其中第行的第个字符如果为,表示第位选手喜欢第位选手,否则如果为,则相反。保证第行第个字符和第行第个字符不同。第行的第个字符没有意义,你应该忽略。
Output
输出行,每行输出一个整数,第行应该输出第期节目选择的方案数。
Samples
2
4
NYNY
NNYY
YNNN
NNYN
4
YYNY
NYYY
YNYN
NNYY
2
2
Limitation
【提示】
请注意多组数据带来的影响。每组数据处理完后,可能用到的计数器需要清零。
若你不会读入字符串并处理,可参考下方
#include <cstdio>
#include <iostream>
#include <algorithm>
const int N = 2000 + 5;
using namespace std;
char s[N][N];
int g[N][N];
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%s", s[i] + 1);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
{
if (s[i][j] == 'Y') g[i][j] = 1;
else g[i][j] = 0;
}
/*
此时已考虑了T组输入,将读入的字符串转为0 / 1数组。
g[i][j] = 0 / 1表示i是否喜欢j
*/
int ans = 0;
}
return 0;
}
【样例说明】
对于第一组数据:合法的选择方案有:。
【数据范围】
对于前的数据:。
对于前的数据:。
对于后的数据:。
相关
在下列比赛中: