关于回溯算法
以皇后问题为例,个人认为根本在于如果这一行的条件不满足,就没办法进入到下一行的“深挖”当中,相当于“中断”了。“中断”之后继续分析本行的上一行的其他列(因为本行就是从上一行“深挖”下来的,所以挖不到东西就继续上一行的工作)。
比如说第二行的某一列找到了,然后第3行的第3列也符合,但是到第四行遍历整列没有一个符合的,这时候便不会在第三行第三列的点深挖,此时便继续遍历第三行第四列、第五列、第六列等等是否满足。
说一下个人浅见,感觉它与递归最大的区别在于,递归需要不断地返回结果(在下一层的计算完后,将结果递交给上层老大);但是回溯算法(以这题为例)感觉是一通到底,虽然也是循环调用条件函数,但是每一层的结果不用提交上层,而是在最后一层判断一下,输出相应结果。
代码:
#include<stdio.h>
#include<iostream>
#define N 8//有多少个皇后
using namespace std;
int col[N+1];//col[0]不用了
int times = 0;
int Nice( int n, int c)
{
int i;
for (i = 1; i <= n - 1; i++)//这里面的i指的是一行行遍历的行号,n和c则是要比对的那行和列(最后那行)
{
if (c == col[i] || c + n == i + col[i] || c - n == col[i] - i)
{
return 0;
}
}
return 1;
}
void Queen(int col[],int n)
{
int i;
if (n > N)
{
for (i = 1; i <= N; i++)
{
cout << col[i]<<" ";
}
cout << endl;
times++;
}
for (i = 1; i <= N; i++)//1到第i列遍历,若是遍历中有任何一个列可以,则可以继续深挖,若是没有一个可行,则遍历结束,根本不会进入到下一个行的任何一列的Queen深挖(即这行代码:Queen(col, n + 1););
{
if (Nice(n,i))
{
col[n] = i;
Queen(col, n + 1);//转接到下一层分析
}
}
}
int main()
{
Queen(col,1);
cout << "总次数" << times;
}