Java проблема с вводом значений в 2d-массив

#java #arrays

#java #массивы

Вопрос:

У меня есть эта проблема, я должен смоделировать канал с 1 и нулями, нули окружают канал, а 1 — это сам канал

Я делаю это, используя 2D-массив, мой код выглядит следующим образом

 for(int i = 0; i < x2; i  ) { //x1 = 10, x2 = 20
        for(int j = 0; j < x2; j  ) {
            if(i >= x2 - (x1 x2)/2 amp;amp; j <= (x1 x2)/2) {
                pipeArray[i][j] = 1;
            } else {
                pipeArray[i][j] = 0;
            }
        }
    }
  

Мой вывод выглядит так

  00000000000000000000
 00000000000000000000
 00000000000000000000
 00000000000000000000
 00000000000000000000
 11111111111111110000
 11111111111111110000
 11111111111111110000
 11111111111111110000
 11111111111111110000
 11111111111111110000
 11111111111111110000
 11111111111111110000
 11111111111111110000
 11111111111111110000
 11111111111111110000
 11111111111111110000
 11111111111111110000
 11111111111111110000
 11111111111111110000
  

И это должно выглядеть как

  00000000000000000000
 00000000000000000000
 00000000000000000000
 00000000000000000000
 00000000000000000000
 00000111111111100000
 00000111111111100000
 00000111111111100000
 00000111111111100000
 00000111111111100000
 00000111111111100000
 00000111111111100000
 00000111111111100000
 00000111111111100000
 00000111111111100000
 00000000000000000000
 00000000000000000000
 00000000000000000000
 00000000000000000000
 00000000000000000000
  

Ответ №1:

Попробуйте это:

 for(int i=0;i<x2;i  ){
    for(int j=0;j<x2;j  ){
        if(i > x2 - (x1 x2)/2 amp;amp; j <= (x1 x2)/2 amp;amp; i<=(x1 x2)/2 amp;amp; j>(x2-(x1 x2)/2) {
            pipeArray[i][j] = 1;
        } else {
            pipeArray[i][j] = 0;
        }
    }
}
  

Проблема заключалась в том, что вы проверяли только, было ли оно ниже или выше одной стороны. Вы не проверили, было ли оно выше или ниже, чем другая сторона, чтобы увидеть, было ли оно между ними.

Комментарии:

1. Я думаю, вам нужно поменять местами 1 и 0 .

2. @Gendarme вы уверены?

3. Я почти уверен, что в вашем коде в середине будут 0, окруженные множеством единиц, а не наоборот.

4. @Gendarme Я не понимаю, чем мой ответ отличается от вашего ответа, но это мог быть я…

5. Условия разные. Вы проверяете, когда координаты находятся на границе; я проверяю, когда они находятся посередине. Другими словами, где у вас есть <= у меня есть > , и где у вас есть >= у меня есть <= . В момент написания этого я замечаю, что вам также нужно изменить >= на > .

Ответ №2:

Это ваше условие i >= x2 - (x1 x2)/2 amp;amp; j <= (x1 x2)/2 . Вы говорите «если строка больше пяти, а столбец меньше 15, тогда поставьте 1». Что вам нужно сказать, так это «если строка больше пяти и меньше 15 и если столбец больше 5 и меньше 15».

Ответ №3:

Вы на самом деле не объяснили правило должным образом, но в отношении желаемого результата я предполагаю, что вам нужна сетка x2 x x2 , где 1 — это x1 x x1 -блок в середине, окруженный 0. Другими словами:

  • Если координаты i и j больше (x2-x1)/2 , но меньше или равны x2-(x2-x1)/2 , имеют значение 1; в противном случае имеют значение 0.

Это было бы переведено на это:

 for(int i = 0; i < x2; i  ) {
    for(int j = 0; j < x2; j  ) {
        if(i > (x2-x1)/2 amp;amp; j > (x2-x1)/2 amp;amp; i <= x2-(x2-x1)/2 amp;amp; j <= x2-(x2-x1)/2) {
            pipeArray[i][j] = 1;
        } else {
            pipeArray[i][j] = 0;
        }
    }
}
  

Ответ №4:

Вам не хватает двух условий: j >= (x2 — (x1 x2) / 2), чтобы ограничить единицы слева. У вас есть условие для правой стороны. также я <= (x1 x2)/2 для ограничения снизу.

 for(int i = 0; i < x2; i  ) { //x1 = 10, x2 = 20
    for(int j = 0; j < x2; j  ) {
        if(i >= x2 - (x1 x2)/2 amp;amp; i <= (x1   x2)/2 amp;amp; j <= (x1 x2)/2 amp;amp; j >= (x1 - (x1 x2)/2)) {
            pipeArray[i][j] = 1;
        } else {
            pipeArray[i][j] = 0;
        }
    }
}
  

Ответ №5:

Есть две проблемы: во-первых, необходимо добавить второе условие, во-вторых, в конце всего 4 строки / столбца по 0, поэтому вам все равно нужно вычесть, например, с помощью (x1 x2-1)/2

     for(int i = 0; i < x2; i  ) { //x1 = 10, x2 = 20
        for(int j = 0; j < x2; j  ) {
            if(i >= x2 - (x1 x2)/2 amp;amp; j <= (x1 x2-1)/2 amp;amp; j >= x2 - (x1 x2)/2 amp;amp; i <= (x1 x2-1)/2) {
                pipeArray[i][j] = 1;
            } else {
                pipeArray[i][j] = 0;
            }
        }
    }
  

Ответ №6:

Для любого канала:

 public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    int n = scan.nextInt();
    int map[][] = new int[n][n];

    int x = n/2;
    int xx = x/2;
    int odd = n%2;

    for(int i=0;i<n;i  ) {
        for(int j=0;j<n;j  ) {
            if((i >= x - xx amp;amp; i < x   xx   odd) amp;amp; (j >= x - xx amp;amp; j < x   xx   odd)) map[i][j] = 1;
            else map[i][j] = 0;
        }
    }

    for(int i=0;i<n;i  ) {
        for(int j=0;j<n;j  ) {
            System.out.print(map[i][j]);
        }
        System.out.println();
    }
}