八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。 现在是n皇后,但是,idea还是一样的,相信大家一定也没问题吧。 拉斯维加斯算法如下 #include<iostream> #include<time.h> #include<cstdlib> #include<cstring> #define MAXSIZE 100 using namespace std; int n; int x[MAXSIZE]; bool place(int count); void nQueue(); bool nQueueLV(); int main(void) { srand((int)time(0)); while(cin>>n) { nQueue(); } return 0; } bool place(int count) { for(int i=1;i<count;i++) { if(abs(x[count]-x[i])==abs(count-i)||x[count]==x[i]) { return false; } } return true; } void nQueue() { while(!nQueueLV()) { ; } for(int i=1;i<=n;i++) { cout<<x[i]<<' '; } cout<<endl; } bool nQueueLV() { memset(x,0,sizeof(x)); int count=1; bool state=true; while(count<=n&&state) { state=false; for(int i=1;i<=n;i++) { int lie=0; while(lie==0) { lie=(int)((n+1)*rand()/(RAND_MAX+1.0)); } x[count]=lie; if(place(count)) { count++; state=true; break; } } } return state; }