如何在C中为8个皇后程序在2d数组上放置一个char

时间:2012-07-25 22:51:24

标签: c arrays 2d

我正在尝试为8 queens puzzle开发一个解决方案,其中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. 如果&gt; 7个皇后,打印阵列并再次运行。
  8. 如果&lt; = 7个女王,请再次跑步,但在第二个女王的位置标记'#'并重复步骤4-5。
  9. if&gt; 7个皇后,打印阵列并再次运行。
  10. 如果&lt; = 7个皇后,重复步骤8直到第二个女王的行中没有'#'。
  11. 如果在第二个女王的行中没有更多的'#',那个行中的空闲内存。
  12. 重复步骤8,但是对于第三位女王的位置。
  13. 重复步骤8 - 11但是对于第4个女王的位置。等
  14. 如果没有更多解决方案,请重复步骤2-13,但在此处标记'#',即第一位女王。
  15. 重复步骤14,直到第一行没有“#”。
  16. 我从未使用过2d数组做任何工作或程序,所以我们非常感谢任何帮助甚至示例代码!

1 个答案:

答案 0 :(得分: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;
}