回溯法.N皇后问题

来源:互联网 发布:儿童学古诗软件 编辑:程序博客网 时间:2024/05/16 09:35

问题及代码:

在n×n 格的棋盘上放置彼此不受攻击的n 个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何2 个皇后不放在同一行或同一列或同一斜线上。 设计一个解n 后问题的队列式分支限界法,计算在n× n个方格上放置彼此不受攻击的n个皇后的放置方案。

#include <stdio.h>#include <math.h>#include <malloc.h>void nQueens(int *x,int n);//求解n皇后问题int place (int *x,int k);//判断是否可以在第k行第x[k]列摆放皇后void printSolution(int *x,int n);//输出求解结果int main(){    int n;    int *x;//存放求解结果的数组首地址    scanf("%d",&n);    x=(int*)malloc(sizeof(int)*(n+1));//动态分配数组空间,x[0]空闲    nQueens(x,n);    return 0;}int place(int *x,int k){    int i;    for(i=1; i<k; i++)//对前k-1行,逐行考察    {        if((x[i]==x[k])||(fabs(x[i]-x[k])==fabs(i-k)))//在同一列或在同一斜线上            return 0;    }    return 1;}void nQueens(int *x,int n){    int k;    k=1;    x[k]=0;//进入循环后即执行了x[k]++,变为了第一列;    while(k>0)    {        x[k]++;        while(x[k]<=n&&!place(x,k))//每一列均进行判断            x[k]++;//下一列        if(x[k]<=n)//找到了一个位置可以摆放皇后        {            if(k==n)                printSolution(x,n);//输出            else            {                k++;//移到下一行                x[k]=0;//从第一列开始考虑            }        }        else            k--;    }}void printSolution(int *x,int n){    int i,j;    for(i=1; i<=n; i++)    {        for(j=1; j<=n; j++)        {            if(j==x[i])                printf("Q");            else                printf("*");        }        printf("\n");    }    printf("\n");}

运行结果


0 0
原创粉丝点击