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

149 篇文章 0 订阅
题目大意: 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[n] = i;其中n是行的数目,也是皇后的数目,i是列的数目
		 * queen[i] == queen[n]  :是否同列
		 * abs(queen[i] - queen[n]) == (n - i) :判断是否在一条斜线上(只需要判断底和高是否相等即可)
		 */
		if(queen[i] == queen[n] || abs(queen[i] - queen[n]) == (n - i)){
			return 1;
		}

	}

	return 0;
}

void put(int n){
	int i;
	for( i = 0 ; i < m ; ++i){
		queen[n] = 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);
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅气的东哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值