2016-09-24 1 views
0

Avec une taille de grille de nxn, un dé est placé sur le champ en haut à gauche (1,1) avec le chiffre 6 vers le bas, 5 en face (1,2) et 4 en face (2 ,1). Les dés rouleront en spirale (dans le sens des aiguilles d'une montre) pour remplir chaque champ d'un nombre (une seule fois). Calculez la somme totale des nombres imprimés. La représentation visuelle des mouvements des dés et les numéros imprimés lorsque n = 5 (résultat = 81)Rouler un dé en spirale

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 

Ceci est une question de devoirs, mais je ne peux pas comprendre comment le faire efficacement sans passer par tous cas possibles. Si quelqu'un pouvait me donner une solution et une explication, ce serait incroyable (aucun code nécessaire, je veux le faire moi-même).

+1

Je ne comprends pas vraiment votre question. en particulier, que signifie «efficacement sans passer par tous les cas possibles». Vous pouvez résoudre cela en 25 itérations relativement simples. Essayez-vous de trouver une * formule * qui, compte tenu de * n *, la résoudra en temps constant? –

Répondre

0

Une manière propre possible de le faire est de définir une classe de dés comme mentionné ci-dessous. Si vous implémentez avec succès les dés, le reste du travail sera une simple simulation du lancer des dés.

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

Si vous acceptez la réponse, veuillez également la mettre en suspens. – v78