Печать 2d массива с использованием 1d массива

0

Я работаю над проблемой восьми королевы/шахматной доски в моем классе. Для моего кода я использую одномерный массив, т.е. q [c] (c - столбец), чтобы сохранить значение строки, состоящей из королевы. например, q [1] = 3 означает, что в столбце 2 (массив, основанный на 0) в строке 4 есть королева.

В исходной задаче использовался 2d-массив, поэтому b [r] [c] будет либо = 0, либо 1, 1 - королевой, а остальное - 0. В программе использовалась функция ok для проверки каждой королевы, которую она помещала против всех ранее размещенных ферзей, и в конце напечатала результат.

The print function was
for(int j=0; j<c;j++)
   cout<<endl;
   for(int i=0; i<c;i++)
      cout<< b[i][j];

который напечатал 92 платы решений, которые выглядели примерно так

10000000
00001000
01000000
00010000
00000010
00100000
00000100
00000001

Теперь для моей проблемы: я не могу для жизни меня выяснить, как получить вышеупомянутый 1-й массив b [c], чтобы напечатать плату, которая выглядит так же, как эта. Я начинающий ученик, но я все еще думал, что это будет намного более тривиально.

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

  • 0
    Подсказка: наивным способом было бы просто: сгенерировать этот 2D-массив из вашего 1D-массива, а затем распечатать его таким же образом. Если вы выполните это упражнение, вы можете найти некоторые лучшие идеи.
  • 0
    В последнем случае вы можете проверить, равен ли я b [j], и вывести либо 0, либо 1
Теги:

3 ответа

0
Лучший ответ

Что-то вроде....

for (int y = 0; y<8; y++) {
   int val = b[y];
   for (int x=0; x<8; x++) {
      x==val ? printf("1") : printf("0") ;
   }
   printf("\n");
}

или

    for (int y = 0; y<8; y++) {
       char[9] line;
       strcpy(line,"00000000");
       line[b[y]] = '1';
       printf("%s\n",line);
    }
  • 1
    благодарю вас. я не знаю, как я раньше этого не видел, но теперь все это имеет смысл! очень признателен
  • 0
    Вы можете выбрать любимый ответ ...
0
#include <iostream>

/*
10000000
00001000
01000000
00010000
00000010
00100000
00000100
00000001
*/

int main()
{
   int q[] = {0, 4, 1, 3, 6, 2, 5, 7};
   for (int i = 0; i < 8; ++i )
   {
      for (int j = 0; j < 8; ++j )
      {
         if ( q[i] == j )
         {
            std::cout << 1;
         }
         else
         {
            std::cout << 0;
         }
      }
      std::cout << std::endl;
   }
   return 0;
}
  • 0
    Большое спасибо! Весьма признателен!
  • 0
    спасибо всем за помощь, я использовал все ваши ответы и разобрался, еще раз спасибо
0

Я предполагаю, что если ваш массив расскажет вам, в каком столбце каждой строки есть королева, вы легко найдете решение. К сожалению, вы должны создавать свой вывод подряд за строкой, так как это как текстовые терминалы. Это не так сложно:

  • Для каждой строки:
    • Для каждого столбца:
      • Если в (строка, столбец) есть королева: print 1, else print 0

У вас уже есть код для этого. За исключением части "если есть королева...". Поэтому позвольте разбить проблему и сделать ее функцией:

bool is_there_a_queen(const int[8] board, int row, int col);

Сможете ли вы реализовать is_there_a_queen?

  • 1
    да, я не включил эту часть в вопрос, извините, но у меня была функция, которая выполняла все проверки (row, down diag, up diag) и использовала backtracking и goto (это первый способ, которым наш профессор показал нам). это было очень полезно, спасибо
  • 0
    Я помню это тогда, когда мы решали задачу «Восемь королев» на уроке, мы обходились без goto … Рад, что смог помочь, жестко.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню