サブ問題の本:再帰アルゴリズム - アルゴリズムは少し毎日(4)ビット

一見単純な質問見当もつかない-_- ||  

タイトル:、数1があります... N N帳、与えるために準備ができnは個人の、利益を読んで一人一人が二次元配列で記述すること

    1:0この本のように:ない本のよう

    [I] [J] = 1、などのI〜Jの本のように

    [I] [J] = 0のように、私は本jを好きではありません

    サブブックは皆を満たす解決する方法

N N個々の書籍。

 

分析:ブックによる答えは、理解することができます。

 

以下のような:

6

100 000は、(最初​​の本のように、最初の本2,3,4,5,6好きではなかったです)

0 1 1 1 1 1

1 1 0 0 0 0

0 0 0 0 1 0

1 1 0 0 1 1 

1 0 1 0 0 0

 

 

  • 最初の人:私は最初の本、独自のディストリビューションの残りの部分を選んだ、それはスタッフすることができますか?(再帰層1)
  • 第二の男:私はあなた自身のディストリビューションの残りの部分を二本を選んだ、それはスタッフすることができますか?(再帰層2)
  • 三人:いいえ!私はちょうど第一および第二の本、本のように、再帰は、再帰的レイヤ2(レイヤ3再帰的)を返す、失敗します
  • 二人目:私は、この第三、および独自のディストリビューションの残りの部分を選んだこと、それはスタッフすることができますか?(再帰層2)
  • 第三者:私は2番目の本あなた自身のディストリビューションの残りの部分を選んだ、それはスタッフすることができますか?(再帰層3)
  • 4人目:私は第五本を選び、あなた自身のディストリビューションの残りの部分は、それがスタッフすることができますか?(再帰層4)
  • 第五人:私は第六本、独自のディストリビューションの残りの部分を選んだ、それはスタッフすることができますか?(再帰層5)
  • 第六男:いいえ、私は本好きではなかった(再帰層6)
  • 第五男:いいえ、これは割り当てることができません(再帰層5)
  • 4番目の男:いいえ、これは割り当てることができません(再帰層4)
  • 第三の男:いいえ、これは割り当てることができません(再帰的なレイヤ3)
  • 第二の男:私は4冊目の本、独自のディストリビューションの残りの部分を選択し、それをスタッフすることができますか?(再帰層2)
  • 第三者:私は2番目の本あなた自身のディストリビューションの残りの部分を選んだ、それはスタッフすることができますか?(再帰層3)
  • 4人目:私は第五本を選び、あなた自身のディストリビューションの残りの部分は、それがスタッフすることができますか?(再帰層4)
  • 第五人:私は第六本、独自のディストリビューションの残りの部分を選んだ、それはスタッフすることができますか?(再帰層5)
  • 第六男:あなたが再帰的な終わりを手渡すことができますので、私は、第三の本を選んだ(再帰層6)

 

 

理解が難しかったが、私は本当にロジック感の強いないので......私を殺しているコードを書き始めていないが。

コードがやっと完成し、やっと私たちはもっとああ見に戻って見る必要があるも、理解しています。本当に自分の将来が心配。

:()...私のストロークのストロークを与えるために兄を見つけるために時間を割いて、レコードとして次のコードを書きました

 

書式#include <iostreamの>
 使用して 、名前空間STD; 

の#define N 550
 INT [N] [N]等;              //   。のような[I] [J] = 1、I-J-ブックの個人的なお気に入り(0嫌い)
int型の答え[ N-N];             //   答え[M] M = iが選択されたi番目の個々の書籍レコード
BOOL選択[N];            //   。選択された[I] = I-ブック1が選択されていない=(0を選択されています)

BOOL検索(int型M){
     IF(M == N-){
         リターン trueに; 
    } 
    ためINT I = 0、I <N - 、I ++ ){
         IFが!(選択された[I] &&[M] [I]){など
            の答え[M] = I + 1 ;             // M-I-ブック選択された個体; 
            選択された[I] = 1 ;
             IF(検索(M + 1 ))
                 リターン trueに ;             // 最初のM + 1個体は本のように、本はi番目返さない 
            選択された[I] = 0 ; 
        } 
    } 
    戻り falseにする; 
} 

int型のmain(){ 
    COUTは << " ----- ----開始ブックから選択します" << てendl; 
    coutの << 完全に人々のこの番号を入力してください<< ENDL;
     一方(scanfの(" %のD "、およびN-)!= EOF){ 
        memsetの(選択され、0はsizeof (選択された)); 
        のmemset(答え、0はsizeof (回答));
         のためのINT I = 0 ; I <N-; I ++ ){
             ためINT J = 0 ; J <N-; J ++ ){ 
                のprintf(" %d個のブックの個々の同類かの%のD、1など、0嫌い:"、I + 1、J + 1 ); 
                scanfの("%d個 "& のような[I] [J]);
                 IF(検索(0 )){ 
                    のprintf(" ブック%D \ N-の個人の選択の%d個"1。 答え[ 0 ]);
                     のためにINT I = 1 ; I <N-; I ++ ){ 
                        のprintf(" ブックの%dの個々の選択のは%d "、I + 1 、回答[I]); 
                        のprintf(" \ N- " ); 
                    } 
                } 
            } 
        }
        裁判所未満 < <" -----ラウンド終了----- " << てendl; 
    } 
    リターン 0 ; 
}

おすすめ

転載: www.cnblogs.com/yinniora/p/12109287.html