HDU 2553 N皇后问题

来源:互联网 发布:网络心理咨询平台推荐 编辑:程序博客网 时间:2024/06/16 05:22

题目信息:

//一种非常有用的二进制优化方法:   http://www.xhua123.com/eight-queen   
/*HDU2553N皇后问题
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
*/

递归回溯

注意先把结果都存下来,不然每个数据遍历一边肯定超时


#include <stdio.h>#include <string.h>int max;int a[15];int val[10][10]={0};int count=0;bool judge(int row,int column){for(int i=0;i<max;++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<max&&j<max;++i,++j){if(val[i][j])return false;}//斜对角线 for(int i=row,j=column;i>=0&&j<max;--i,++j){if(val[i][j])return false;}for(int i=row,j=column;i<max&&j>=0;++i,--j){if(val[i][j])return false;}return true;}void fun(int row){if(row==max){//递归出口 ++count;return;}for(int i=0;i<max;++i){if(judge(row,i))//判断 {val[row][i]=1;//标记 fun(row+1);//下一层 val[row][i]=0;//去标记 }}}int main(){for(max = 1; max <= 10; max++){count = 0;memset(val,0,sizeof(val));fun(0);a[max] = count;}while(scanf("%d", &max) && max){printf("%d\n",a[max]);}return 0;}


0 0
原创粉丝点击