N-Queen 初学者回溯

Posted

技术标签:

【中文标题】N-Queen 初学者回溯【英文标题】:N-Queen Beginner Backtracking 【发布时间】:2019-01-14 13:12:42 【问题描述】:

为了练习我所学到的回溯算法,我正在尝试解决 N-Queen 问题。

我编写了一些函数来检查移动是否合法,但我不知道如何使用回溯来实现这些函数。

bool manger_ligne (int a[][4],int i) 
    for (int j=0;j<4;j++) 
        if (a[i][j] == 1)
            return false ;
    

    return true;


bool manger_col (int a[][4],int j) 
    for (int i=0;i<4;i++) 
        if (a[i][j] == 1)
            return false ;
    
    return true ; 


bool isTrue (int a[][4],int i,int j,int k) 
    if (k==0) 
        return 1;
    
    if (i > 3 && j > 3) 
        return 0;
    

    if (manger_diagonal(a, i, j) == true && manger_col(a, j) == true &&
        manger_ligne(a, i) == true) 
        a[i][j] = 1;
        if (isTrue(a, i, j+1 ,k) == true) 
            if (isTrue(a, i+1,j ,k) == true) //backtracking problem
                return true;
        
        a[i][j] = 0;
    
    return false ;

【问题讨论】:

【参考方案1】:

几天前,我不得不将这项任务作为学校任务完成。这是一个有 8 个皇后的解决方案。我解决了如下:

我主要调用函数solveQn。然后程序自己做所有事情。

布尔求解NQ:

bool solveNQ()
int board[N][N] =  
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0
;
if ( solveNQUtil(board, 0) == false )

printf("Solution does not exist");
return false;

printSolution(board);
return true;

布尔求解NQUntil:

bool solveNQUtil(int board[N][N], int col)
if (col >= N)
    return true;
for (int i = 0; i < N; i++)

    if ( isSafe(board, i, col) )
    
        board[i][col] = 1;
        if ( solveNQUtil(board, col + 1) )
            return true;
        board[i][col] = 0;
    

return false;

布尔是安全的:

bool isSafe(int board[N][N], 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;

输出解:

void printSolution(int board[N][N])
for (int i = 0; i < N; i++)

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


在本例中,您需要在代码的开头定义一个值为 8 的全局变量 N。 您还需要包含头文件 stdbool.h,因为在这里您将使用布尔值。

【讨论】:

以上是关于N-Queen 初学者回溯的主要内容,如果未能解决你的问题,请参考以下文章

Swift BackTracking N-queen

UVa 11195 Another n-Queen Problem

回溯法浅谈

README回溯算法基本框架

适合初学者的良好调试器教程 [关闭]

如何在 Scala 中停止回溯?