TopCoder SRM 460 Div1 Easy TheQuestionsAndAnswersDivOne

問題

n種類の質問をした。
何回か同じ質問をしたかもしれないが、質問に対しては"Yes"または"No"の答えが返る。
それぞれの質問に対する答えが与えられるとき、質問の仕方は何通りあるか求めよ。

制約条件

n≦9
質問の個数≦9

方針

全探索による数え上げ。
ただし、そのままだとTLEするので枝刈りを入れる。


その時点で質問がn種類に達しないようならば、その時点で探索を打ち切る。
これで最悪ケースが300msくらいになる。

ソースコード

int n,m;
int cnt,ans[9];
bool q[9];
void rec(int c){
  if(c==m){
    rep(i,n)if(ans[i]<0)return;
    cnt++; return;
  }
  int rest=0;
  rep(i,n)if(ans[i]<0)rest++;
  if(rest>m-c)return;
  
  rep(i,n)if(ans[i]==-1||ans[i]==q[c]){
    int t=ans[i];
    ans[i]=q[c];
    rec(c+1);
    ans[i]=t;
  }
}
class TheQuestionsAndAnswersDivOne {
  public:
  int find(int questions, vector <string> answers) {
    n=questions;
    m=answers.size();
    rep(i,m)q[i]=answers[i]=="Yes";
    cnt=0;
    rep(i,n)ans[i]=-1;
    rec(0);
    return cnt;
  }
};