回溯法复习

首先是最经典的n皇后问题

代码如下:

#include
#include 
#include 
using namespace std;
typedef long long LL;
const int maxn = 1000;
int n;
LL ans;
int vis[3][2*maxn];
void solve(int cur)
{
	if(cur==n)
		ans++;
	else
	{
		for(int i = 0;i
其中vis数组中为第i列,主对角线,副对角线有无冲突,注意在本次dfs后要将数组vis还原。

然后是例题:UVa524

#include
#include 
#include 
using namespace std;
int a[20];
int vis[20];
int isprime[35];
int n;
void dfs(int cur)
{
	if(cur==n)
	{
		if(isprime[a[n-1]+a[0]]==1)
		{
			for(int i = 0;i
这道题注意点有三个:

1)注意输出格式,必须是后面有数据输入的情况下,前面的空行才会输出,所以打印的空行要在前面显示。

2)注意每个结果都是从1开始的,所以先要有a[0]=1,然后从1开始dfs。

3)注意最后一个数还要与前面的第一个数加起来判断是否为素数。

UVa129

#include
#include 
#include 
using namespace std;
int n,L;
int cnt;
int a[100];
int dfs(int cur)
{
	if(cnt==n)
	{
		for(int i = 0;i
本题目的注意要点为:

1)当dfs找到结果时,应该剪枝,利用dfs的返回结果来判定是否剪枝值得学习

2)在进行条件判断时,只需要判断当前(cur)的位置是否满足条件即可。







你可能感兴趣的:(算法)