2016-09-24 10 views
0

グリッドサイズがnxnであれば、番号6が下向き、5が向く(1,2)、4が向く(2)のダイスが左上のフィールド(1,1)に置かれます。 、1)。サイコロは時計回りに回転し、各フィールドに数字を入力します(1回のみ)。印刷された数字の合計を計算します。サイコロの動きとn = 5(結果は= 81)ダイスをらせん状に巻く

01 02 03 04 05 
16 17 18 19 06 
15 24 25 20 07 
14 23 22 21 08 
13 12 11 10 09 

6 5 1 2 6 
4 5 3 2 4 
1 1 3 1 1 
3 2 3 5 3 
6 5 1 2 6 

これは宿題の質問ですが、私はすべてを経由せずに効率的にこれを行う方法を見つけ出すことはできません印刷された数字を視覚的に表現可能な場合。誰かが私に解決策と説明を与えることができればそれは驚くべきことです(コードは必要ありません、自分でそれをしたいです)。

+1

私は本当にあなたの質問を得ることはありません。特に、すべての可能性のある事例を通らずに効率的に行うこと "を意味します。これを25の比較的単純な繰り返しで解くことができます。 * n *が与えられたとき、一定の時間内にそれを解くことができる* formula *を考えようとしていますか? –

答えて

0

可能なクリーンな方法は、下記のようにクラスDiceを定義することです。

class Dice 
{ 
public: 
    Dice(); 
    int face_down(); 
    void roll_west(); 
    void roll_east(); 
    void roll_north(); 
    void roll_south(); 
    void set_initial_config(int face_down,int east,int north,int west,int south); 
    ~Dice(); 
private: 
    /// variables for your state etc 
}; 

ダイスを正しく実装すると、残りの作業はダイスのローリングの単純なシミュレーションになります。

int roll(int n,int m){ // grid dimensions 

    std::vector<std::vector<bool> > visited(n,std::vector<bool>(m,0)); 

    int i=0,j=-1; 
    int dir=0; 
    bool dir_changed; 
    int dir_change_count=0; 
    int sum=0; 
    Dice d; 

    while(dir_change_count<4){ 

     dir_changed=0; 
     switch(dir){ 
      case 0: 
       if(j+1<m and !visited[i][j+1]){ 
        j++; 
        visited[i][j+1]=1; 
        d.roll_east(); 
       }else{ 
        dir_changed=1; 
        dir++; 
       } 
       break; 
      case 1: 
       if(i+1<n and !visited[i+1][j]){ 
        i++; 
        visited[i+1][j]=1; 
        d.roll_south(); 
       }else{ 
        dir_changed=1; 
        dir++; 
       } 
       break; 
      case 2: 
       if(j-1>=0 and !visited[i][j-1]){ 
        j--; 
        visited[i][j-1]=1; 
        d.roll_west(); 
       }else{ 
        dir_changed=1; 
        dir++; 
       } 
       break; 
      case 3: 
       if(i-1>=0 and !visited[i-1][j]){ 
        i--; 
        visited[i-1][j]=1; 
        d.roll_north(); 
       }else{ 
        dir_changed=1; 
        dir++; 
       } 
       break; 
     } 
     if(!dir_changed){ 
      sum+=d.face_down(); 
      dir_change_count=0; 
     }else{ 
      dir_change_count++; 
     } 
    } 

    return sum; 
} 
+0

あなたが答えを受け入れるならば、質問をupvoteしてください。 – v78