回溯法的一个经典实例-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);
}
这个是经典的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);
}
相关文章推荐
- HDU 2553 N皇后问题(经典的回溯问题)
- HDOJ 2553 N皇后问题(经典回溯)
- 回溯法特点分析以及经典N皇后问题
- HDU 2553 N皇后问题 --- 经典回溯
- 回溯法之经典问题->皇后问题
- 棋盘摆放皇后问题(回溯思想的经典应用)
- 一个经典的n皇后问题
- N皇后问题--回溯算法的经典实例
- 回溯经典算法之四皇后问题
- 巩固基础篇:八皇后问题:经典回溯法
- 递归回溯问题的四道经典题:N皇后,组合,全排列,二叉树路径和
- 经典回溯问题----n皇后
- 经典回溯算法之n皇后问题
- 经典回溯算法之N皇后问题
- 回溯经典-n皇后问题
- 秒杀多线程第四篇 一个经典的多线程同步问题
- 递归与回溯之经典八皇后问题
- 使用flume问题总结3——一个使用flume拦截器和选择器的简单实例
- 秒杀多线程第四篇 一个经典的多线程同步问题
- 回溯: 8皇后问题