您的位置:首页 > 其它

(step4.3.2)hdu 2553(N皇后问题)

2013-08-16 23:45 369 查看
题目大意:n*n棋盘要放n个皇后,要求意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。最多几种方案

/*
* 2553_1.cpp
*
* Created on: 2013年8月16日
* Author: Administrator
*/

#include <iostream>

using namespace std;

int sum,m;
int queen[11];
int method[11];

//用来判断是否同行或者是同斜线
bool check(int n){
int i;
for( i = 0 ; i < n ; ++i){
/**
*为什么只需要判断是否同列或者同一斜线即可呢??不需要判断同行吗??
* 因为i指的就是行,而i是递增的,所以行就是递增的。所以行肯定不同
*
* queen
= i;其中n是行的数目,也是皇后的数目,i是列的数目
* queen[i] == queen
:是否同列
* abs(queen[i] - queen
) == (n - i) :判断是否在一条斜线上(只需要判断底和高是否相等即可)
*/
if(queen[i] == queen
|| abs(queen[i] - queen
) == (n - i)){
return 1;
}

}

return 0;
}

void put(int n){
int i;
for( i = 0 ; i < m ; ++i){
queen
= i;
if(!check(n)){
if( n == m-1){
++sum;
}else{
put(n+1);
}
}
}
}

int main(){
while(scanf("%d",&m)!=EOF,m){
memset(queen,0,sizeof(queen));
sum = 0;
if(method[m] != 0){
printf("%d\n",method[m]);
}else{
put(0);
method[m] = sum;
printf("%d\n",sum);
}
}
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: