八皇后之回溯法(C语言版)
题目描述: 八皇后问题是十九世纪著名数学家高斯于1850年提出的。问题是:在8*8的棋盘上摆放8个皇后,使其不能互相攻击,即任意的两个皇后不能处在同意行,同一列,或同意斜线上。可以把八皇后问题拓展为n皇后问题,即在n*n的棋盘上摆放n个皇后,使其任意两个皇后都不能处于同一行、同一列或同一斜线上。 题目分析: 显然,每一行可以而且必须放一个皇后,所以n皇后问题的解可以用一个n元向量X=(x1,x2,.....xn)表示,其中,1≤i≤n且1≤xi≤n,即第n个皇后放在第i行第xi列上。 由于两个皇后不能放在同一列上,所以,解向量X必须满足的约束条件为: xi≠xj; 若两个皇后的摆放位置分别是(i,xi)和(j,xj),在棋盘上斜率为-1的斜线上,满足条件i-j = xi-xj; 在棋盘上斜率为1的斜线上,满足条件i+j=xi+xj; 综合两种情况,由于两个皇后不能位于同一斜线上,所以,解向量X必须满足的约束条件为: |i-xi| ≠ |j-xj| 代码:
#include
#include
using namespace std;
int x[100];
int num = 0;
/*
考察皇后k放置在x[k]列是否会发生冲突
*/
bool place(int k)
{
int i;
//需要依次考虑第k行与其前面的已经放置好的皇后是否冲突
for( i = 1;
i < k;
i ++){
if( x[k] == x[i] || abs(k-i) == abs(x[k] - x[i]))
return false;
}
return true;
}void queen(int n)
{
int k;
for(int i = 0;
i <= n;
i++ )
x[i] = 0;
//初始化,开始每一列都没有皇后
k = 1;
while( k >= 1){
x[k] ++;
//在下一列放置第k个皇后
while( x[k] <= n && !place(k))//x[i]存放的是第i行应该放置的列值,每一个x[i]的取值应该是第一列到第n列
x[k] ++;
//搜索下一列
//每次放置好一个皇后之后,判断一下是
if( x[k] <= n &&k == n){//第n行的皇后也放置好了,说明每一个皇后都放在了可以的位置,得到一个输出
num ++ ;
//for(int i = 1;
i <= n;
i++)
// cout << x[i] << endl;
}
else if(x[k] <= n && k < n)
k ++;
//放置下一个的皇后
else {// k行的皇后没有找到合适的位置,回溯
x[k] = 0;
k --;
}
}
}
int main()
{
int n;
cout << "输入皇后个数:\n" << endl;
cin >> n;
queen(n);
cout<< num;
return 0;
}
转自:http://qbview.url.cn/getResourceInfo?appid=31&url=http%3A%2F%2Fwww.cnblogs.com%2Fqinyg%2Farchive%2F2012%2F05%2F21%2F2512353.html%3Fnsukey%3DOJQQTpWOuIp2prnBw2VYroIRElk6TKcYZxk5u0Snu882Zxcq13dx4ioWyZ68AyuqhcHBLZNDgBYdbMg26C5ClGmv5Y1v6ZXgHPNcuu7K1rDIfHI4RD5yzfrpiD6hF2cGIN9VY7UyASDeo1LgkGmbbMw%252F4FIZICBc%252BUoYBvn2BzfT2feZfUmGmyBOqONYvjtM&version=10000&doview=1&ua=Mozilla%2F5.0+(Macintosh%3B+Intel+Mac+OS+X+10_11_6)+AppleWebKit%2F601.7.7+(KHTML%2C+like+Gecko)+Version%2F9.1.2+Safari%2F601.7.7&keeplink=0&reformat=0
推荐阅读
- 用|用 Python 写网络编程(二)
- JavaScript|JavaScript - 子集1(回溯法)
- 回溯法、动态规划法——牛妹的蛋糕
- Java下实现无重字符串的全排列(递归和回溯方法)
- Codeforces 1076E——回溯
- leetcode|Java实现 LeetCode N皇后(回溯+dfs)
- 力扣 79.单词搜索+212.单词搜索II
- 八皇后问题C语言解法(递归、回溯)
- 八皇后问题回溯非递归算法的C语言实现(文中是C语言的基本语法)
- C语言回溯算法解决N皇后问题