-3
votes

Motif d'impression utilisant des boucles

Je résolvez un défi sur Hackerrank. Il imprime un numéro dans le motif en spirale décroissant sa valeur à chaque achèvement du cercle.

4 4 4 4 4 4 4
4 3 3 3 3 3 4
4 3 2 2 2 3 4
4 3 2 1 2 3 4
4 3 2 2 2 3 4
4 3 3 3 3 3 4
4 4 4 4 4 4 4 4 P>

111
101
111


13 commentaires

Quelle est l'entrée que vous obtenez? C'est la valeur de 'n'.


L'entrée est un nombre compris entre 1 et 1000.


Qu'est-ce que cela signifie?


Pour n = 5 et n = 7, il échoue après avoir ajouté +1 à Printf. S'il vous plaît ne suggérez pas le codage dur. Il doit fonctionner pour 1


Quelle est votre entrée lorsque vous attendez une sortie de votre question?


Vous venez de décrémenter la valeur 'n' et de l'attribuer à la boucle extérieure à chaque cycle. Le compteur de rangée et de colonne ne décrément pas. Les valeurs du milieu sont des valeurs des ordures.


@Santosh - Les valeurs de la rangée et du col correspondent. s'il te plait regarde. Après une spirale complète, balayez la valeur de N changements. Je vais de gauche-> droit-> bas-> gauche-> haut en 1 balayage en spirale, diminuant la valeur de N et répéter la spirale.


@Devilan - L'entrée est prise en variable n. 1


Ici une version raffinée - github.com/abcool/c_training/blob/hackerrank-c_practice / ...


Comme ce n'est pas en fait un motif en spirale, vous n'avez pas besoin de la matrice ou de tous ces pendant boucles. Vous pouvez le faire avec juste ces deux pour boucles


@chris Turner - Comment?


@Arvindbakshi: Vous entrez donc un nombre compris entre 1 et 1000 et votre sortie attendue (3x3 carrés avec 1s et 2)?


Si je vous ai dit comment, cela vaincuerait le point du défi - vous devriez vous résoudre vous-même.


3 Réponses :


0
votes

vérifier ce code. Compiler en ligne J'ai utilisé votre même code avec un tampon supplémentaire 'x'. Cela rend le cadre à traverser la boucle dans la diminution de la spirale.

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main() 
{
  int n,row,col,size;
  scanf("%d", &n);
  // Complete the code to print the pattern.
  size=2*n;
  int x = n;
  int arr[size-1][size-1];
  //n=n+1;
  while(n>0){
    row=x-n;
    col=x-n;
    while(col<size-(x-n)-2){
      arr[row][col] = n;
      col++;
    }
    col=size-(x-n)-2;
    row=x-n;
    while(row<size-(x-n)-1){
      arr[row][col]=n;
      row++;
    }
    row = size-(x-n)-2;
    col = size-(x-n)-2;
    while (col >x-n) {
      arr[row][col] = n;
      col--;
    }
    col = x-n;
    row = size-(x-n)-2;
    while (row > x-n) {
      arr[row][col] = n;
      row--;
    }
    n--;
  }
  for(row=0;row<size-1;row++){
    for(col=0;col<size-1;col++){
      printf("%d ",arr[row][col]);
    }
    printf("\n");
  }
  return 0;
}


14 commentaires

Non ça marche. Tout ce dont vous avez besoin est un écran pour voir (100 * 2) -1 = 199 Numéro en une seule ligne.


Pour ce numéro, transférez la sortie à un fichier texte. Avec Word Warp non contrôlé, vous pouvez le voir.


Voir J'ai téléchargé un code de nettoyage mais votre logique ne fonctionne pas avec elle.


Mec. Vous répétez la même chose. Vous décrémentez la valeur N et changeez uniquement la boucle extérieure.


Quel est le but d'utiliser x?


x est à la décrémentation du cadre en spirale. Comprenez-vous le concept?


Pour cela, j'avais utilisé n--.


À l'intérieur tandis que la boucle est la totalité de 1 rotation complète dans le sens des aiguilles d'une montre et N-- répaets Il rétrécit la taille du cadre. Alors pourquoi x?


Ouais ... u ne réduit que la valeur "n", cela ne diminue pas non pas la rangée ni la colonne ... De plus, il ne réduit pas la taille de la trame. S'il vous plaît comprendre ... Pour réduire le nombre de lignes et de colonnes, j'ai utilisé 'X-N' à chaque fois.


Voyez juste la différence en exécutant à la fois les codes, pour comprendre le processus de compilation étape par étape, utilisez le compilateur Turbo C (F7).


J'utilise Mingw.


@ Santosh- pendant que je comparais à commencer à commencer l'index de tableau 0, vous l'avez remplacée par X-N. Aussi u ajout de taille - (x-n) aux conditions. De plus, vous stockez la valeur initiale de N dans x. Toujours x-n est déroutant.


J'utilise (x-n) comme tampon qui change dans chaque boucle. Par exemple, prenez l'entrée comme 4-> Vous devez commencer à partir de 0,0 (x-n est 0), pour la deuxième fois que vous devez commencer à partir de 1,1 (maintenant X-N est 1). Si vous commencez l'index avec 0, votre cadre tourne uniquement sur la boucle extérieure. C'est pourquoi je n'utilise pas x-n. Cela fait du cadre pour faire pivoter à la boucle interne à chaque cycle.


@ Santosh- github.com/abcool/c_training/blob/hackerrank-c_practice/...



0
votes

Si la performance et la "écrasement" ne comptent pas, vous pouvez essayer cette version courte intuitive.

#include <stdio.h>
#include <stdlib.h>

int main() 
{
  int n, size;
  scanf("%d", &n);
  size=2*n-1;
  int arr[size][size];

  for(int i=0; i<n;i++)
      for(int row=i; row<size-i; row++)
          for(int col=i; col<size-i; col++)
            arr[row][col] = n-i;

  for(int row=0; row<size; row++) {
    for(int col=0; col<size; col++)
      printf("%d ",arr[row][col]);
    printf("\n");
  }
  return 0;
}


0 commentaires

1
votes
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main()
{
    int n;
    scanf("%d", &n);

    for(int i = n; i >= 1; i--){
        for(int j = n; j > i; j--)
            printf("%d ", j);
        for(int j = 1; j <= 2 * i - 1; j++)
            printf("%d ", i);
        for(int j = i + 1; j <= n; j++)
            printf("%d ", j);
        printf("\n");
    }

    for(int i = 1; i < n; i++){
        for(int j = n; j > i; j--)
            printf("%d ", j);
        for(int j = 1; j <= 2 * i - 1; j++)
            printf("%d ", i + 1);
        for(int j = i + 1; j <= n; j++)
            printf("%d ", j);
        printf("\n");
    }

    return 0;
}

0 commentaires