位运算实现八皇后,并打印出结果

本篇文章的算法参考自资料n皇后问题位运算版,c++的代码参考自位运算解决八皇后问题

我所做的补充不过是将结果打印出来。

因为每一次位置都是用二进制来表示,所以打印出二进制数即标示皇后的位置。考虑到八皇后所放置的位置具有对称性,所以从头打印的所有结果与从尾打印出来的所有结果都是一样的。运行环境为win32。

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <list>

using namespace std;

#define QueenNum 8
long sum = 0;
long upperlim = (1 << QueenNum) - 1;
list<int> queenList;
void printBinary(int data)
{
	int maxLength = QueenNum;
	list<int> byteList;

	int a = 0,b = 0;
	while((a = data / 2) != 0)
	{
		b = data % 2;
		byteList.push_front(b);
		data = data / 2;
	}
	byteList.push_front(data % 2);
	while(maxLength > byteList.size())
	{
		printf("0 ");
		maxLength--;
	}
	list<int>::iterator iter = byteList.begin();
	for(; iter != byteList.end(); iter++)
	{
		printf("%d ", *iter);
	}
	printf("\n");
}
int times = 0;
void printQueenList(list<int> &l)
{
	printf("begin times : %d\n", ++times);
	list<int>::iterator iter = l.begin();
	for(;iter != l.end(); iter++)
	{
		printBinary(*iter);
	}
	printf("end\n");
}
//八皇后问题


void queenTest(int row, int ld, int rd)
{
	long pos, p;
	
	if(row != upperlim)
	{
		//取得所有可放置的位置
		pos = upperlim & (~(row | ld | rd));
		while(pos)
		{
			p = pos & (~pos + 1);
			pos = pos - p;
			queenList.push_front(p);

			queenTest(row | p, (ld | p) << 1, (rd | p) >> 1);
		}

	}else
	{
		printQueenList(queenList);
		sum++;
		
	}
	if(queenList.size()> 0)
	{
		queenList.pop_front();
	}
	
}
int _tmain(int argc, _TCHAR* argv[])
{
	queenTest(0,0,0);
	printf("sum : %d", sum);
	system("pause");
	return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值