您的位置:首页 > 其它

回溯法的一个经典实例-n皇后问题

2006-10-01 14:53 274 查看
在国际象棋盘上放八个皇后,互相不能攻击,有多少种摆法?
这个是经典的8皇后问题,解决此问题的方法是回溯法。

回溯法是一种思路简单而且有效的解决问题的基础算法。

解决一个问题的时候分成n个步骤,每向后进展一个步骤,就检查一下当前的状态,如果发生了冲突,就放弃,如果到达了目标状态就记录下答案,回溯,求解下一个解。

对于8皇后问题,每个步骤就是在棋盘上放一个棋子,每放一个棋子,就检查当前的状态,有否产生攻击,如果没有攻击,就继续放下一个,如果攻击了,就回溯,如果放够八个,就打印结果,然后回溯。




/**//*


作者:shaoshaoh


日期:2006-10-01


声明:欢迎转载,但请保留此信息


Blog:http://blog.csdn.net/shaoshaoh




经典的八皇后问题


*/


#include "math.h"


#include <iostream>


using namespace std;




//全局变量


int n, total;


int stack[20];




void inc(int & x)




...{


x++;


}




void make(int l)




...{


if (l == n+1)




...{


inc(total);


cout<<"Solve "<<total<<endl;




for ( int i=1; i<=n ; i++)




...{


cout<<stack[i]<<" ";


}


cout<<endl;


return;


}




bool att;


for(int i = 1; i<=n; i++)




...{


att = false;


stack[l]=i;


for (int j = 1; j<=l-1;j++)




...{


if ( ( abs(l-j) == abs(stack[j]-i) )


|| (i== stack[j]) )




...{


att=true;


j=l-1;


}


}


if (!att) make(l+1);


}


}






void main(void)




...{


cout<<"Please insert the number of queens:"<<endl;


cin>>n;


total =0;




make(1);


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: