2016-01-15 4 views
0

Задачи: мне нужно сделать метод, который будет найти самый большой квадратного подматрицы с 1s в границах и 0s внутри, от матрицы (2d массива), которые могли бы быть квадратным, но не обязательно. Все элементы матрицы - 1s и 0s.Самая большая площадь подматрицы с 0s внутри и 1s вне

Это мой код

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); 
} 

Переменные: х и у - от й и у координаты (р [х] [у]) г - длина квадратной подматрицы

Где ошибка , Почему я не получаю эти x, y и z для этого примера. Я проверил все это на циклы, они берут элементы, которые им нужно. И если у вас есть какие-то советы, я бы хотел узнать лучше. Благодаря!

+0

Сколько площадей есть? есть ли какая-либо гарантия того, что не будет нулей вне квадратов или границ за пределами? – tucuxi

+0

Единственное, что имеет значение, состоит в том, что квадрат самый большой, по крайней мере, один ноль внутри (окруженный одними). Единицы в границе, ноль (ы) внутри. Самый большой возможный. –

+0

В вашем примере есть прямоугольник 0s, но не квадрат 0s. – tucuxi

ответ

0

Я не могу понять ваш подход, но я думаю, что это может немного переусердствовать. Например, у вас есть несколько фрагментов кода, проверяющих, является ли элемент 0 или 1, когда это можно сделать в одном месте.

Это может помочь вам сделать шаг назад и переоценить ваш код. Что он должен делать?

«Мне нужно сделать метод, который будет найти большую площадь подматрицы с 1s в границах и 0s внутри» с примером:

{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} 

теперь я думаю, что я могу сортировать получить свой подход, но давайте писать из:

biggest_square = 0

для каждого элемента в матрице:

если угол квадрата

выяснить, насколько большой квадрат

набор biggest_square макс (квадрат, biggest_square)

конец, если

конец для

возвращения most_square

Вопрос теперь в том, как узнать размер квадрата. Для этого мы можем начать одиночный нуль, а затем проверить, есть ли следующий слой квадрата. Как это:

{0} проверка следующий слой

{0 0},

{0 0} проверка следующий слой

{0 0 0}

{0 0 0}

{0 0 0} проверка следующий слой

и так далее

Для этого мы можем:

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++ 

Заключительное замечание о стиле: это, как правило, лучше космические вещи и положить начало и конец блоков на новых строках и выбрать описательное имя для переменных. Я понятия не имею, что означают переменные sm и bg, и «классный» не особенно описателен.

Извините за ошибки, и я надеюсь, что это поможет вам решить вашу проблему.

+0

Ну, что такое меньшая длина в строках или столбцах, bg, что больше. Я сделал те, из-за которых я хочу с самого большого квадрата, чтобы проверить меньшие. Первый должен быть самым большим. Cool - это переменная, которая должна быть истинна до конца y, называемого для цикла. Внутри этого я проверяю все граничные элементы квадрата, если они все 1, а один из них - для внутренних элементов, чтобы проверить, все ли они нули. В конце, если cool истинно, он должен распечатать начальные координаты x и y холодного квадрата. –

+0

Я попытался переместиться вправо с квадратом некоторого размера до конца (прямо в этом примере) и переместить его на один, а затем повторить до конца. –

Смежные вопросы