Как да поставите символ върху 2d масив за програма с 8 дами в C

Опитвам се да разработя решение на пъзела с 8 дами, където трябва да бъдат поставени 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, докато няма повече '#' във втория ред на дамата.
  11. ако няма повече '#' във втория ред на дамата, освободете памет от този ред.
  12. Повторете стъпка 8, но за 3-та позиция на дамата.
  13. Повторете стъпки 8 - 11, но за 4-та позиция на дамата. и т.н.
  14. Ако няма повече решения, повторете стъпки 2-13, но маркирайте '#', където този път беше първата царица.
  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