XMU 1098 N皇后

原创 2012年03月21日 16:51:01
#include<iostream>
#include<cmath>
#include<time.h>
using namespace std;
const unsigned long maxshort=65536L;
const unsigned long multiplier=1194211693L;
const unsigned long adder=12345L;
class RandomNumber
{
private:
	unsigned long randSeed;
public:
	RandomNumber(unsigned long s=0);
	unsigned short Random(unsigned long n);
	double fRandom(void);
};

RandomNumber::RandomNumber(unsigned long s)
{
	if(s==0)
		randSeed=time(0);
	else 
		randSeed=s;
}
unsigned short RandomNumber::Random(unsigned long n)
{
	randSeed = multiplier * randSeed + adder;
	return (unsigned short) ((randSeed>>16) % n);
}
double RandomNumber::fRandom(void)
{
	return Random(maxshort)/double(maxshort);
}
class Queen
{
	friend bool nQueen(int);
private:
	bool place(int k);
	bool backtrack(int t);
	bool queenLV(int stopLV);
	int n ,*x,*y;
};

bool Queen::place(int k)
{
	for(int j=1;j<k;j++)
		if((abs(k-j)==abs(x[j]-x[k])) || (x[j]==x[k]))
			return false;
	return true;
}

bool Queen::backtrack(int t)
{
	if(t>n)
	{
		for(int i=1;i<=n;i++)
			y[i]=x[i];
		return true;
	}
	else
		for(int i=1;i<=n;i++)
		{
			x[t]=i;
			if(place(t) && backtrack(t+1))
				return true;
		}
		return false;
}

bool Queen::queenLV(int stopLV)
{
	RandomNumber rnd;
	int k=1;
	int count=1;
	while((k<= stopLV ) && (count>0))
	{
		count=0;
		for(int i=1;i<=n;i++)
		{
			x[k]=i;
			if(place(k))
				y[count++]=i;
		}
		if(count>0)
			x[k++]=y[rnd.Random(count)];
	}
	return (count>0);

}

bool nQueen(int n)
{
	Queen X;
	X.n=n;
	int *p=new int[n+1];
	int *q=new int[n+1];
	for(int i=0;i<=n;i++)
	{
		p[i]=0;
		q[i]=0;
	}
	X.y=p;
	X.x=q;
	int stop=5;
	if(n<5)
		stop=1;
	if(n>15)
		stop=n-15;
	bool found = false;
	while(!X.queenLV(stop));
	if(X.backtrack(stop+1))
	{
		for(int i=1;i<=n;i++)
			cout<<i<<" "<<p[i]<<endl;
		found = true;
	}
	delete[] p;
	delete[] q;
	return found;
}

int main()
{
	int n;
	cin>>n;
	while(!nQueen(n));
	return 0;
}

51NOD 1098 最小方差(基础数学)

传送门 若x1,x2,x3……xn的平均数为k。 则方差s^2 = 1/n * [(x1-k)^2+(x2-k)^2+…….+(xn-k)^2] 。 方差即偏离平方的均值,称为标准差或均方差,方...
  • qingshui23
  • qingshui23
  • 2016年07月05日 19:59
  • 2294

应用redis读取报错_使用了twemproxy不支持的命令

2017-11-22 架构:lvs-twemproxy-redis 应用redis读取报错如下: 2017/11/20 16:18:44 [error] [exception.Redi...
  • stillit
  • stillit
  • 2017年11月22日 15:40
  • 182

HDU 1098 数学归纳法

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1098 思路:数学归纳法     观察可发现规律:13*5=65,并且  f(x)=5*x^13...
  • adcxz
  • adcxz
  • 2017年01月06日 13:24
  • 100

【二分】XMU 1587 中位数

题目链接:   http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1587 题目大意:   求两个长度为n(n9)的有序序列合并后的中位数。序列中的数在...
  • u010568270
  • u010568270
  • 2016年08月16日 23:35
  • 86

TYVJ 1098 任务安排

题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务。从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间是Ti。在每批任...
  • qq_32126633
  • qq_32126633
  • 2016年10月24日 23:38
  • 296

约瑟夫问题 URAL 1098

思想:归纳为数学性问题。原文说的很好,还是直接Copy吧,因为搜索半天也没有找到原作者,所以无法添加引用地址了,如果这位大哥看到这里,请告知与我,小弟立刻加入引用链接:) 无论是用链表实现还是用...
  • yang_zongjun
  • yang_zongjun
  • 2014年08月27日 14:09
  • 309

ZCMU 1098 查找元素

1098: 查找元素Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 1042  Solved: 167 [Submit][Status][Web B...
  • sinat_35866463
  • sinat_35866463
  • 2017年05月03日 15:54
  • 233

【数学】XMU 1597 GCD

题目链接:   http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1597 题目大意:   求(am-bm, an-bn),结果取模1000000007...
  • u010568270
  • u010568270
  • 2016年08月16日 23:35
  • 156

HDU 1098解题报告

Ignatius's puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other...
  • u012294939
  • u012294939
  • 2014年09月30日 19:56
  • 395

51NOD 1098 最小方差

1098 最小方差 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题若x1,x2,x3......xn的平均数为k。 则方差s^2 = 1/n * [(x1-k)^2...
  • LuRiCheng
  • LuRiCheng
  • 2016年10月19日 19:05
  • 185
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:XMU 1098 N皇后
举报原因:
原因补充:

(最多只允许输入30个字)