HWOJ N皇后

注意: 1、回溯法

     2、逐行判断

     3、打印调试

算法:将不能填入的棋盘格进行计数累加,回溯时则将计数累减。当所有皇后都放入棋盘则累加计数值并返回。

代码:

#include "OJ.h"

/*
功能: 求解放置8皇后方案的个数。
输入:
    无
返回:
    int:放置8皇后方案的个数
*/

void PrintQueen(int *chess,int n){
	int k,size=n*n;
	printf("\n");
	for(k=0;k<size;k++){
		printf("%d ",chess[k]);
		if(k>0 && (n-1)==k%n)
		  printf("\n");
	}
}
void RecordChess(int *chess,int x,int y,int n,int m){
	int i,j;
	for(i=x,j=0;j<n;j++)
		chess[j+i*n] += m;
	for(i=0,j=y;i<n;i++)
		chess[j+i*n] += m;
	for(i=x-1,j=y-1;i>=0 && j>=0;i--,j--)
		chess[j+i*n] += m;
	for(i=x+1,j=y+1;i<n && j<n;i++,j++)
		chess[j+i*n] += m;
	for(i=x-1,j=y+1;i>=0 && j<n;i--,j++)
		chess[j+i*n] += m;
	for(i=x+1,j=y-1;i<n && j>=0;i++,j--)
		chess[j+i*n] += m;
	chess[y+x*n] -= m;
}
int PlaceQueen(int *chess,int qn,int *count,int n){
	int i,j,k;
	if(n == qn){
		(*count)++;
		//PrintQueen(chess,n);
		return 0;
	}
	for(k=0;k<n;k++){
		i = qn;
		j = k;
		if(0 != chess[j+i*n])
			continue;
		else{
			RecordChess(chess,i,j,n,1);
			//PrintQueen(chess,n);
			PlaceQueen(chess,qn+1,count,n);
			RecordChess(chess,i,j,n,-1);
			//PrintQueen(chess,n);
		}
	}
	return 0;
}
int PlaceQueenMethodNum(int n)
{
    /*在这里实现功能*/
	int *chess = NULL;
	int m = 0;
	if(n<=0)
		return -1;
	chess = (int *)malloc(n*n*sizeof(int));
	if(!chess)
		return -1;
	memset(chess,0,n*n*sizeof(int));
	PlaceQueen(chess,0,&m,n);
    return m;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值