Как поместить символ в 2d-массив для программы 8 ферзей на C

Я пытаюсь разработать решение загадки с восемью ферзями, где 8 ферзей должны быть размещены на шахматная доска 8x8, чтобы двое не могли атаковать друг друга. Я могу распечатать свою доску со знаком «#», но не могу понять, как разместить ферзя на первом месте и сделать все горизонтальные, вертикальные и диагональные места «x».

Вот что у меня есть до сих пор:

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

#define ROW 8
#define COL 8

// Make the chessboard

int main(int argc, char * argv[])
{
    char board[ROW][COL];
    int i, j;

    for(i = 0; i < ROW; i++)
    {
        for(j = 0; j < COL; j++)
        {
            board[i][j] = '#';
            printf(" %c", board[i][j]);
        }
        printf("\n");
    }
    return 0;
}

// Place queen on first '#'

int placeQueen(char board[ROW][COL])
{
    char queenSpace;
    int i, j;

    for(i = 0; i < ROW; i++)
    {
        for(j = 0; j < COL; j++)
        {
            queenSpace = 'Q';
            board[i][j] = queenSpace;
            printf(" %c", board[1][1]);
        }
        printf("\n");
    }
    return 0;
}

Вывод прямо сейчас находится слева, мне нужно, чтобы он был таким, как показано справа:

# # # # # # # #            Q x x x x x x x
# # # # # # # #            x x # # # # # #
# # # # # # # #            x # x # # # # #
# # # # # # # #            x # # x # # # #
# # # # # # # #            x # # # x # # #
# # # # # # # #            x # # # # x # #
# # # # # # # #            x # # # # # x #
# # # # # # # #            x # # # # # # x

Вот мой алгоритм:

  1. Создайте массив 8x8 со всеми '#'.
  2. Поместите ферзя на первый доступный «#».
  3. Измените все горизонтальные, вертикальные и диагональные квадраты с позиции ферзя на «x».
  4. Поместите еще одну ферзя на первое место со знаком «#».
  5. Измените все горизонтальные, вертикальные и диагональные клетки с новой позиции ферзя на «x».
  6. Повторяйте шаги 4-5 до тех пор, пока не останется «#».
  7. Если > 7 ферзей, напечатайте массив и запустите снова.
  8. Если ‹= 7 ферзей, запустите снова, но с отметкой «#» в месте расположения 2-го ферзя и повторите шаги 4-5.
  9. если> 7 ферзей, напечатайте массив и запустите снова.
  10. если ‹= 7 ферзей, повторяйте шаг 8 до тех пор, пока во 2-м ряду ферзей не останется «#».
  11. если во 2-м ряду ферзя больше нет «#», освободить память из этого ряда.
  12. Повторите шаг 8, но для позиции 3-го ферзя.
  13. Повторите шаги 8-11, но для позиции 4-го ферзя. И т. д.
  14. Если больше нет решений, повторите шаги 2-13, но отметьте «#» там, где на этот раз был 1-й ферзь.
  15. Повторяйте шаг 14 до тех пор, пока в первой строке не останется «#».

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


person Fred Lohrman    schedule 25.07.2012    source источник
comment
Во-первых, вы никогда не звоните placeQueen. Вы также зацикливаетесь на всей доске, когда утверждаете, что вам просто нужно это в одном месте.   -  person chris    schedule 26.07.2012
comment
Каковы номера квадратов в ряду некоторых квадратов? Каковы номера квадратов в столбце некоторого квадрата? Несколько более сложный вопрос: каковы номера квадратов на диагоналях некоторых квадратов? Как только вы поняли это, вы можете поставить крестики на этих квадратах. Кроме того, вам нужно узнать о возврате. Найдите SO для этого или просто для восьми ферзей ... это обычная проблема, и она обсуждалась ранее.   -  person Jim Balter    schedule 26.07.2012


Ответы (1)


Некоторые подсказки. Абстрагируйте свой основной тип данных:

#define ROW 8
#define COL 8
typedef char t_board[ROW][COL];
#define ItRows(Var) for (int Var = 0; Var < ROW; Var++)
#define ItCols(Var) for (int Var = 0; Var < COL; Var++)
#define EMPTY  '+'
#define QUEEN  'Q'
#define ATTACK '-'

#define bool int
#define true 1
#define false 0

тогда вы можете упростить объявление операций, выполняемых над типом данных, и сосредоточиться на логике отдельных шагов:

void init(t_board board) {
   ItRows(r)
       ItCols(c)
           board[r][c] = EMPTY;
}
void show(t_board board) {
   ItRows(r) {
       ItCols(c)
           printf(" %c", board[r][c]);
       printf("\n");
   }
}
void assign(t_board target, const t_board source) {
   ItRows(r)
       ItCols(c)
           target[r][c] = source[r][c];
}
bool reserve(t_board board, int row, int col, char cell) {
    if (board[row][col] == QUEEN)
        return false;
    board[row][col] = cell;
    return true;
}
bool place_queen(t_board board, int row, int col) {
   ItRows(r)
       if (r != row && !reserve(board, r, col, ATTACK))
           return false;
    ItCols(c)
       if (c != col && !reserve(board, row, c, ATTACK))
           return false;

    #define AttackDiag(R, C) \
       for (int r = row + R, c = col + C; r >= 0 && c >= 0 && r < ROW && c < COL; r += R, c += C) \
          if (!reserve(board, r, c, ATTACK)) \
              return false;
    AttackDiag(+1, +1)
    AttackDiag(+1, -1)
    AttackDiag(-1, +1)
    AttackDiag(-1, -1)

    return reserve(board, row, col, QUEEN);
}
int main_queens(int argc, char **argv) {
    t_board b;
    init(b);
    assert(place_queen(b, 3, 2));
    show(b);
    return 0;
}
person CapelliC    schedule 26.07.2012