2016-01-15 1 views
0

Tâche: je dois faire une méthode qui va trouver le plus grand sous-matrice carrée avec 1s en bordure et 0s à l'intérieur, de la matrice (tableau 2d) qui pourrait être carré mais n'a pas besoin d'être. Tous les éléments de la matrice sont 1 et 0.plus grand sous-matrice carrée avec des 0 à l'intérieur et de 1 à l'extérieur

C'est mon code

static void sub(int[][] p){ 
    int sm=(p[0].length<p.length)?p[0].length:p.length; 
    int bg=(p[0].length<p.length)?p.length:p[0].length; 
    if(p.length==p[0].length){ 
     sm=p.length;bg=p.length; 
    } 
    int t=0; 
    boolean cool=false; 

    z:for(int z=sm;z>2;z--){ 
     x:for(int x=0,l=0;x<sm-z;x++,l++){ 
      y:for(int y=0,m=0;y<bg-z;y++,m++){ 
       for (int i=y;i<=z+m;i++){ 
        if(p[x][i]!=1){cool=false; continue x;} 
        else cool=true; 
        if(p[z][i]!=1){cool=false; continue x;} 
        else cool=true; 
       } 
       int n=0; 
       for(int j=0;j<z-1;j++) 
       for(int i=y+1;i<z+m;i++){ 
        if(p[x+n][i]!=0){cool=false; continue x;} 
        else cool=true; 
        if(i==z+m-1)n++; 
       } 
       for (int i=x+1;i<z+l;i++){ 
        if(p[i][y]!=1){cool=false; continue x;} 
        else cool=true; 
       } 
       for(int i=x+1;i<=z-1;i++){ 
        if(p[i][z+t]!=1) continue x; 
       } 
       if(cool){ 
        System.out.println(x+" "+y+" "+z); 
       } 
       t++; 
      } 
      t=0; 
     } 
    } 
} 
public static void main(String[] args) { 
    int[][] p = { 
      {1,1,1,1,1,1,1,1,1}, 
      {1,0,0,0,1,1,1,1,1}, 
      {1,0,0,0,1,1,1,1,1}, 
      {1,0,0,0,1,1,1,1,1}, 
      {1,0,0,0,1,1,1,1,1}, 
      {1,0,0,0,1,1,1,1,1}, 
      {1,1,1,1,1,1,1,1,1} 
    }; 
    sub(p); 
} 

Variables: x et y - à partir coordonnées x et y (p [x] [y]) z - longueur de sous-matrice carrée

Où est erreur . Pourquoi je ne reçois pas ces x, y et z pour cet exemple. J'ai testé tout cela pour les boucles qu'ils prennent des éléments qu'ils devraient. Et si vous avez un conseil, un meilleur moyen que j'aimerais savoir. Merci!

+0

Combien y a-t-il de carrés? Y a-t-il une garantie qu'il n'y aura pas de zéros à l'extérieur des cases ou à l'extérieur des frontières? – tucuxi

+0

La seule chose qui importe est que le carré est le plus grand avec au moins un zéro à l'intérieur (entouré par ceux). Ones dans la frontière, zéro (s) à l'intérieur. Le plus grand possible –

+0

Dans votre exemple, il existe un rectangle de 0, mais pas un carré de 0. – tucuxi

Répondre

0

Je ne peux pas vraiment comprendre votre approche, mais je pense que c'est peut-être exagéré un peu. Par exemple vous avez plusieurs morceaux de code vérifiant si un élément est 0 ou 1 quand il pourrait être fait en un seul endroit.

Il peut être utile de prendre du recul et de réévaluer votre code. Qu'est-ce que c'est censé faire?

« Je dois faire une méthode qui trouvera le plus grand sous-matrice carrée avec 1s en bordure et 0s à l'intérieur » avec par exemple:

{1,1,1,1,1,1,1,1,1}, 
    {1,0,0,0,1,1,1,1,1}, 
    {1,0,0,0,1,1,1,1,1}, 
    {1,0,0,0,1,1,1,1,1}, 
    {1,0,0,0,1,1,1,1,1}, 
    {1,0,0,0,1,1,1,1,1}, 
    {1,1,1,1,1,1,1,1,1} 

maintenant je pense que je peux en quelque sorte obtenir votre approche, mais nous allons l'écrire out:

biggest_square = 0

pour chaque élément de la matrice:

si elle est le coin d'un carré

trouver sur la taille de la place est

set biggest_square max (carré, biggest_square)

fin si

fin pour

retour larger_square

La question est maintenant de savoir comment trouver le taille du carré. Pour ce faire, nous pouvons commencer le zéro unique et ensuite vérifier si la couche suivante du carré est là. Comme ceci:

{0} check couche suivante

{0 0},

{0 0} check couche suivante

{0 0 0}

{0 0 0}

{0 0 0} vérifier la couche suivante

et ainsi de suite

Pour ce faire, nous pouvons:

while matrix[i][j]==0: 
    //check row below bottom of square 
    for j =start_j to i: 
     if matrix[i][j]!=0: 
      break 
     i++ 

    // if the side is short than the current side length 
    if i<j: 
     break 

    //check column to right of square 
    for j= start_j to i: 
     if matrix[i][j]!=0: 
      break 
     j++ 
    //the row below and column to the right have all 0's so add to the square 
    biggest_square++ 

Une note finale sur le style: il vaut mieux généralement les choses espacer et mettre le début et la fin de blocs sur de nouvelles lignes et de choisir un nom descriptif pour les variables. Je n'ai aucune idée de ce que les variables sm et bg sont censées être et "cool" n'est pas particulièrement descriptif.

Désolé pour toutes les erreurs et j'espère que cela vous aide à résoudre votre problème.

+0

Bien sm est ce qui est la plus petite longueur en lignes ou colonnes, bg ce qui est plus grand. J'ai fait ces raisons car je veux du plus grand carré possible pour vérifier les plus petits. Premier devrait être le plus grand. Cool est un varable qui doit être vrai jusqu'à la fin de y nommé pour la boucle. A l'intérieur, je vérifie tous les éléments de la bordure du carré s'ils sont tous égaux à 1, et l'un d'eux est pour les éléments internes afin de vérifier s'ils sont tous des zéros. À la fin si cool est vrai, il devrait imprimer les coordonnées x et y de départ du carré froid. –

+0

J'ai essayé de me déplacer à droite avec un carré de quelque taille jusqu'à la fin (à droite dans cet exemple) et de le déplacer vers le bas puis de le répéter jusqu'à la fin. –