N皇后问题

来源:互联网 发布:linux查看文件权限 编辑:程序博客网 时间:2024/06/06 10:52

n皇后问题输入n,表示在n*n的棋牌上放n个皇后,要求皇后不同行、不同列、不同对角线。

 

解决思路:用二维数组表示棋盘,其值0代表没有放的位置、其值1代表放了皇后,从棋盘的第一行第一列开始找合适位置(由于找到位置直接进入下一行,故不用考虑同行的。由于从第一行开始,判断是否同对角线时只需考虑左上和右上),找到后进入下一行,未找到就回溯到上一行找,直到遍历所有的位置。



具体代码:

#include<iostream>#include<cstdio>#include<cstring>int qi[20][20];//用于构造棋盘int n,sum;//n棋盘大小,sum记录符合的个数int pan(int k,int i){    int j,t;    for(j=0;j<k;j++)//判断同列是否有皇后        if(qi[j][i])return 0;    for(j=k-1,t=i-1;j>=0&&t>=0;t--,j--)//判断左上是否有皇后        if(qi[j][t])return 0;    for(j=k-1,t=i+1;j>=0&&t<n;t++,j--)//判断左上是否有皇后        if(qi[j][t])return 0;    return 1;}void DSF(int k){    if(n==k)    {        for(int i=0;i<n;i++){            for(int j=0;j<n;j++)            {                printf("%d ",qi[i][j]);            }            printf("\n");        }        printf("\n\n");        sum++;        return ;    }    for(int i=0;i<n;i++)    {        if(pan(k,i)){            qi[k][i]=1;//位置符合放皇后            DSF(k+1);            qi[k][i]=0;//用于回溯        }    }}int main(){    while(scanf("%d",&n)!=EOF)    {        memset(qi,0,sizeof(qi));//初始化棋盘(清理棋盘)        sum=0;        DSF(0);//从第一行开始找        printf("%d\n",sum);    }return 0;}




原创粉丝点击