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
*/
0 意見:
張貼留言