2017年5月22日 星期一

b547 巧克力口味

/*
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 意見:

張貼留言