C语言和Java解决N皇后问题

问题介绍

一 JAVA实现N皇后

import java.util.*;

public class NQueens {

    public static void solveNQueens(int n) {
        char[][] board = new char[n][n];
        for (char[] row : board) {
            Arrays.fill(row, '.');
        }
        List<List<String>> result = new ArrayList<>();
        solveNQueensHelper(board, 0, result);
        printResult(result);
    }

    private static void solveNQueensHelper(char[][] board, int row, List<List<String>> result) {
        if (row == board.length) {
            result.add(generateBoard(board));
            return;
        }
        for (int col = 0; col < board.length; col++) {
            if (isValid(board, row, col)) {
                board[row][col] = 'Q';
                solveNQueensHelper(board, row + 1, result);
                board[row][col] = '.';
            }
        }
    }

    private static boolean isValid(char[][] board, int row, int col) {
        for (int i = 0; i < row; i++) {
            if (board[i][col] == 'Q') return false;
            int diff = row - i;
            if (col - diff >= 0 && board[i][col - diff] == 'Q') return false;
            if (col + diff < board.length && board[i][col + diff] == 'Q') return false;
        }
        return true;
    }

    private static List<String> generateBoard(char[][] board) {
        List<String> result = new ArrayList<>();
        for (char[] row : board) {
            result.add(new String(row));
        }
        return result;
    }

    private static void printResult(List<List<String>> result) {
        for (List<String> board : result) {
            for (String row : board) {
                System.out.println(row);
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        int n = 8; // 更改n以解决不同规模的问题
        solveNQueens(n);
    }
}

代码解释:

  1. solveNQueens(int n):该函数是入口点,它初始化一个n x n的棋盘,然后调用solveNQueensHelper来解决N皇后问题。

  2. solveNQueensHelper(char[][] board, int row, List<List<String>> result):递归函数,尝试在给定行row中放置皇后,如果成功,则递归到下一行。

  3. isValid(char[][] board, int row, int col):检查在给定位置(row, col)是否可以放置皇后,避免同一列、同一对角线存在皇后。

  4. generateBoard(char[][] board):将字符数组表示的棋盘转换为字符串列表,用于最终输出。

  5. printResult(List<List<String>> result):打印最终结果。

  6. main函数:设置N的值并调用solveNQueens来解决问题。

二 C语言实现N皇后问题

#include <stdio.h>
#include <stdbool.h>

#define N 8 // 更改N以解决不同规模的问题

int board[N][N];

void printSolution() {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++)
            printf("%2d ", board[i][j]);
        printf("\n");
    }
}

bool isSafe(int row, int col) {
    int i, j;
    for (i = 0; i < col; i++)
        if (board[row][i])
            return false;
    for (i = row, j = col; i >= 0 && j >= 0; i--, j--)
        if (board[i][j])
            return false;
    for (i = row, j = col; j >= 0 && i < N; i++, j--)
        if (board[i][j])
            return false;
    return true;
}

bool solveNQueensUtil(int col) {
    if (col >= N)
        return true;
    for (int i = 0; i < N; i++) {
        if (isSafe(i, col)) {
            board[i][col] = 1;
            if (solveNQueensUtil(col + 1))
                return true;
            board[i][col] = 0; 
        }
    }
    return false;
}

bool solveNQueens() {
    if (solveNQueensUtil(0) == false) {
        printf("Solution does not exist");
        return false;
    }
    printSolution();
    return true;
}

int main() {
    solveNQueens();
    return 0;
}

代码解释:

  1. printSolution:打印解决方案。

  2. isSafe(int row, int col):检查在给定位置(row, col)是否可以放置皇后,避免同一列、同一对角线存在皇后。

  3. solveNQueensUtil(int col):递归函数,尝试在给定列col中放置皇后,如果成功,则递归到下一列。

  4. solveNQueens:公共函数,初始化并调用solveNQueensUtil来解决N皇后问题。

  5. main函数:设置N的值并调用solveNQueens来解决问题。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值