HDU-n皇后

来源:互联网 发布:黑马云计算大数据视频 编辑:程序博客网 时间:2024/06/07 00:30

N皇后问题

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 18437 Accepted Submission(s): 8332

Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。

Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。

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

Sample Input

1
8
5
0

Sample Output

1
92
10

AC

#include <stdio.h>#include <string.h>int a[11][11];int s[10];int count=0;int sum;int n;int check(int x,int y){    int i,j;    for(i=0;i<x;i++)    {           if(a[i][y]==1)            return 0;    }//向上找     for(i=x,j=y;i>=0&&j>=0;i--,j--)    {        if(a[i][j]==1)              return 0;    }//左上     for(i=x,j=y;i>=0&&j<n;i--,j++)    {        if(a[i][j]==1)              return 0;    }//右上     return 1;}void fun(int m){    int i;    if(m==n)    {        sum++;        return;    }       for(i=0;i<n;i++)    {        if(check(m,i))         {            a[m][i]=1;            fun(m+1);            a[m][i]=0;        }       } } /*int main(){    while(scanf("%d",&n)&&n)    {        memset(a,0,sizeof(a));        count=0;        fun(0);        printf("%d\n",count);    }     return 0;} */int main(){    for(n=1;n<=10;n++)//HDU要打表 否则会超时    {        memset(a,0,sizeof(a));        sum = 0;        fun(0);        s[n] = sum;    }    while(scanf("%d",&n)&&n)    {        printf("%d\n",s[n]);    }     return 0;} 

(二)

#include <stdio.h>int val[10][10];int count = 0;          //方法数 bool judge(int row, int column){    //当前列是否有值     for(int i = 0; i < row; ++i)    {        if(val[i][column])            return false;    }    //对角线     for(int i = row, j = column; i >= 0 && j >= 0; --i, --j)    {        if(val[i][j])            return false;    }    //反对角线     for(int i = row, j = column; i >= 0 && j < 8; --i, ++j)    {        if(val[i][j])            return false;    }    return true;}void fun(int row){    if(row == 8)    //递归出口     {        ++count;        return;    }    for(int i = 0; i < 8; ++i)    {        if(judge(row, i))       //判断         {            val[row][i] = 1;    //标记             fun(row + 1);       //下一层             val[row][i] = 0;    //去标记         }    }}int main(){    fun(0);    printf("%d\n", count);    return 0;}
0 0