4.3.6--N皇后问题--深搜

来源:互联网 发布:各大电商平台比价软件 编辑:程序博客网 时间:2024/06/06 15:47

Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output

共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1850
Sample Output
19210

代码:

#include<iostream>#include<cmath>#include<cstdio>using namespace std;int n,cnt;int ans[11],t[11];void f(int m)  //每一行{    if(m>n) {cnt++; return;}    int x,y,i;   //用(y,x)代表放置位置    x=m;        //纵坐标为m    for(y=1;y<=n;y++)  //迭代横坐标    {        for(i=1;i<x;i++)   //已经放置完的行        {            if(y==t[i])      //处在相同列                break;        }        if(i<x) continue;        for(i=1;i<x;i++)        {            if(abs(y-t[i])==(x-i))    //处在与棋盘边框成45角的斜线上                break;        }        if(i<x) continue;        t[x]=y;   //成功放置        f(m+1);    }}int main(){    for(n=1;n<=10;n++)    {        cnt=0;        f(1);        ans[n]=cnt;    }    while(scanf("%d",&n)&&n)    {        printf("%d\n",ans[n]);    }    return 0;}


原创粉丝点击