问题介绍
![](https://i-blog.csdnimg.cn/blog_migrate/f18f682bda5d60bc846bcca38986349a.png)
一 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);
}
}
代码解释:
-
solveNQueens(int n)
:该函数是入口点,它初始化一个n x n
的棋盘,然后调用solveNQueensHelper
来解决N皇后问题。
-
solveNQueensHelper(char[][] board, int row, List<List<String>> result)
:递归函数,尝试在给定行row
中放置皇后,如果成功,则递归到下一行。
-
isValid(char[][] board, int row, int col)
:检查在给定位置(row, col)是否可以放置皇后,避免同一列、同一对角线存在皇后。
-
generateBoard(char[][] board)
:将字符数组表示的棋盘转换为字符串列表,用于最终输出。
-
printResult(List<List<String>> result)
:打印最终结果。
-
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;
}
代码解释:
-
printSolution
:打印解决方案。
-
isSafe(int row, int col)
:检查在给定位置(row, col)是否可以放置皇后,避免同一列、同一对角线存在皇后。
-
solveNQueensUtil(int col)
:递归函数,尝试在给定列col
中放置皇后,如果成功,则递归到下一列。
-
solveNQueens
:公共函数,初始化并调用solveNQueensUtil
来解决N皇后问题。
-
main
函数:设置N的值并调用solveNQueens
来解决问题。