皇后问题

关于回溯算法

以皇后问题为例,个人认为根本在于如果这一行的条件不满足,就没办法进入到下一行的“深挖”当中,相当于“中断”了。“中断”之后继续分析本行的上一行的其他列(因为本行就是从上一行“深挖”下来的,所以挖不到东西就继续上一行的工作)。

比如说第二行的某一列找到了,然后第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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值