/*
b547-巧克力口味
*/
#include <iostream>
#include <sstream>
#include <iomanip>
#include <cstring>
#include <cstdio>
#include <vector>
#include <map>
#include <set>
#include <algorithm>
using namespace std;
const int MaxR = 10;
set <string> rel[MaxR];  // 最多 10 種 關係
map <int , int> c2n;
string rs(8,'?');
string c6(6,' ');
int getn(int i)
{
 int j=c2n[ c6[i] ];
 j += c2n[ c6[i+1] ];
 return j;
}
// 以遞迴 將某一關係的所有編號建立 存入 rel[si]中
string ss[]={"PBY","SCT"};
void setr(int si, int p, int q)
{
 int i,j;
 if(q==6) // 已 6個字元了
 {
  bool mk[10];
  string one="";
  memset(mk,0,sizeof(mk));
  for(i=0; i<6; i+=2)
  {
   j= getn(i);
   if( mk[j] ) return; // 出現過,不合
   mk[j] = true;
   one += char('0'+j);
  }
  rel[si].insert(one);  // 可以的關係編號 加入 rel[si] 中
////  cout << si <<':' << one << endl;  /////
 }
 else  // 完成第 q 個字元,遞迴下一字元 q+1
 {
  if( rs[p+q]=='?' )  // 目前這個位置為 ?  偶則以 PBY各代1次、 奇則以 SCT各代1次
     for(i=0; i<3; ++i)
     {
      c6[q] = ss[q%2][i]; setr(si, p, q+1);
     }
  else
  {
   c6[q] = rs[p+q]; setr(si, p, q+1);
  }
 }
}
string x,y,z; // 將nine切成3部份
int r;  //共 r 個關係
bool ok()   // 任一個關係  最少要有 某一列 3個巧克力 符合它
{
 for(int si=0; si<r; ++si)
 {
  if( !( rel[si].find(x)!=rel[si].end()  ||  rel[si].find(y)!=rel[si].end()  ||  rel[si].find(z)!=rel[si].end()  )  ) return false;
 }
 return true;
}
int main(void)
{
 int i,j,k,t ,n;
 char c;
 c2n.clear();
 c2n['P']=0; c2n['B']=3; c2n['Y']=6;
 c2n['S']=1; c2n['C']=2; c2n['T']=3;
 
 cin >> r;
 for(i=0; i<r; ++i)
 {
  cin >> t;
  for(j=0; j<t*2; ++j)
  {
   cin >> rs[j+2];/// >> rs[j+3];   
  }
///  cout << i <<':' << rs << endl;   ////
  if(t==3) setr(i,2,0);   // 第i個關係,從第2字元、已轉了0個
  else // t=2 , 前?? 及後 ?? 各一次
  {
   setr(i,0,0);   // 第i個關係,從第0字元、已轉了0個
   rs[6] = rs[7] ='?';
   setr(i,2,0);   // 第i個關係,從第2字元、已轉了0個
  }
 }
 string nine="123456789";
//   cout << nine << endl;   1~9 九位數,全排列  共 9! =  362880
   int cnt=0;
 do
 {
  x=nine.substr(0,3); y=nine.substr(3,3); z=nine.substr(6,3);
 // cout << x <<',' << y <<',' << z <<'\n';
  if( ok() ) ++cnt;
   }  while( next_permutation(nine.begin(),nine.end() ) );
 cout << cnt << endl;
// system("pause");
 return 0;
}
/*
3
3 B S Y S P C
3 P T B C Y T
3 P S B T Y C
3
3 B S Y ? ? C
2 B C Y T
3 P S ? ? Y C
==========
6
24
*/
沒有留言:
張貼留言