ブルーブリッジ杯第3回C/C++予選本題(4)変な試合(再帰)

7456 ワード

あるテレビ局は低炭素生活グランプリを開催した.問題の採点ルールはかなりおかしいです.
各選手は10個の質問(その番号は1から10)に答えなければならないが、後ろほど難しい.正解は、現在の点数が2倍になった.答えを間違えると問題番号と同じ点数を差し引く(選手は質問に答えなければならず、答えないのは間違いで処理する).
各選手にはスタートの点数が10点ある.
ある優勝選手の最終得点はちょうど100点で、試合の過程を見せなければ、彼(彼女)のどの問題が正しいのか、どの問題が間違っているのか推測できますか.
正解を1,正解を0とすると,10問の回答状況は1と0のみの列で表すことができる.たとえば、0010110011が可能です.
あなたの任務はすべての可能性を算出することです.答えごとに1行を占める.
答えは「解答.txt」に書いてあります.ここに書かないでください.
 
 
再帰.
各層の再帰は1つの問題の誤りを表し、前のすべての問題の誤りを1つの配列で格納する再帰を書きます.n=10になるまで、現在の成績が現在の問題が間違っている場合の得点が100であるかどうかを計算します.100出力の場合.
答え:
0010110011

0111010000

1011010000

コード:
 1 #include <iostream>

 2 using namespace std;  3 int a[11];  4 void f(int n,int r,int s)    //       (     )      

 5 {  6     if(r){    //       

 7         if(n==10 && s*2==100){  8             a[n]=r;  9             for(int i=1;i<=10;i++) 10                 cout<<a[i]; 11             cout<<endl; 12             return ; 13  } 14         else if(n==10 && s*2!=100) 15             return ; 16         else { 17             a[n]=r; 18             f(n+1,0,s*2); 19             f(n+1,1,s*2); 20  } 21  } 22     else{ 23         if(n==10 && s-n==100){ 24             a[n]=r; 25             for(int i=1;i<=10;i++) 26                 cout<<a[i]; 27             cout<<endl; 28             return ; 29  } 30         else if(n==10 && s-n!=100) 31             return ; 32         else{ 33             a[n]=r; 34             f(n+1,0,s-n); 35             f(n+1,1,s-n); 36  } 37  } 38 } 39 int main() 40 { 41     f(1,0,10); 42     f(1,1,10); 43     return 0; 44 }

 
Freecode : www.cnblogs.com/yym2013