八皇后(dfs)

来源:互联网 发布:java统一授权管理平台 编辑:程序博客网 时间:2024/06/05 17:24

题目描述

检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。

上面的布局可以用序列2 4 6 1 3 5来描述,第i个数字表示在第i行的相应位置有一个棋子,如下:

行号 1 2 3 4 5 6

列号 2 4 6 1 3 5

这只是跳棋放置的一个解。请编一个程序找出所有跳棋放置的解。并把它们以上面的序列方法输出。解按字典顺序排列。请输出前3个解。最后一行是解的总个数。

输入输出格式

输入格式:

一个数字N (6 <= N <= 13) 表示棋盘是N x N大小的。

输出格式:

前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。

#include<iostream>#include<cstdio>#include<algorithm>#include<string.h>using namespace std;int n,cnt=0;int result=0;int a[15];int ck[100][100];void  dfs(int step){     if(step==n+1)     {         if(result<3){         for(int i=1;i<=n;i++)         {             cout<<a[i];             if(i==n)cout<<endl;             else cout<<" ";         }         result++;         }         cnt++;         return ;     }     for(int i=1;i<=n;i++)     {         if((!ck[0][i])&&(!ck[1][step+i])&&(!ck[2][step-i+n]))         {             a[step]=i;             ck[0][i]=1;             ck[1][step+i]=1;ck[2][step-i+n]=1;             dfs(step+1);             ck[0][i]=0;             ck[1][step+i]=0;ck[2][step-i+n]=0;         }     }}int main(){    while(cin>>n)    {        memset(a,0,sizeof(a));        memset(ck,0,sizeof(ck));        dfs(1);        cout<<cnt<<endl;        cnt=0;        result=0;    }}

原创粉丝点击