N皇后问题

q:N皇后问题。请问如何在N*N棋盘上无冲突的摆放N个皇后棋子,即任一皇后所在位置的水平、垂直、45°斜线上均不能有其他皇后棋子。

本问题采用回溯法,所谓回溯法,就是按照深度优先搜索的方法,从根节点出发深度搜索。当搜索到某个节点时,判断该节点是否包含问题的解,如果包含,就从该节点出发继续搜索下去;如果该节点不包含问题的解,跳过对以该节点为根的子树的搜索,逐层向其祖先节点回溯。具体代码如下:

#include <stdio.h>
#include <stdlib.h>

#define MAX_DEPTH 20

int isok_queen(int n, int i, int j, int (*q)[MAX_DEPTH])
{
    int ii,jj,k;
    for(ii=0,jj=j; ii < n; ii++)
        if(q[ii][jj] == 1) return 0;
    for(ii=i,jj=0; jj < n; jj++)
        if(q[ii][jj] == 1) return 0;
    for(ii=i,jj=j,k=0; (ii-k>=0)&&(jj-k>=0); k++)
        if(q[ii-k][jj-k] == 1) return 0;
    for(k=0; (ii+k<n)&&(jj-k>=0); k++)
        if(q[ii+k][jj-k] == 1) return 0;
    for(k=0; (ii+k<n)&&(jj+k<n); k++)
        if(q[ii+k][jj+k] == 1) return 0;
    for(k=0; (ii-k>=0)&&(jj+k<n); k++)
        if(q[ii-k][jj+k] == 1) return 0;
    return 1;
}

void queen(int n, int j, int (*q)[MAX_DEPTH])
{
    int i=0;
    if(j == n)
    {
        for(i=0; i<n; i++)
        {
            for(j=0; j<n; j++)
            {
                if(q[i][j] == 1)
                {
                    printf("1 ");
                }
                else printf("0 ");
            }
            printf("\n");
        }
        printf("\n");
    }
    else
    {
        for(i=0; i<n; i++)
        {
            if( isok_queen(n,i,j,q) )
            {
                q[i][j] = 1;
                queen(n,j+1,q);
                    q[i][j] = 0;
            }
        }
    }
}



int main()
{
    int i,j,n,q[MAX_DEPTH][MAX_DEPTH];
    printf("please input the depth of the n*n array\n");
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
            q[i][j] = 0;
    }
    queen(n,0,q);
    return 0;
}




你可能感兴趣的:(算法,回溯法,深度优先搜索,N皇后)