欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【一级讲解】素数环——DFS深度优先搜索

程序员文章站 2022-03-15 11:13:11
...

素数环

题目:从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数。输出所有情况和种数


问题分析:

最近刚好在学深度优先搜索,就找了一些题目练练手,之前有写过一篇很粗糙的DFS文章,以啊哈算法这本书的题目为例,画图讲解了一下DFS的基本原理(尤其是回溯复原那部分)。

根据啊哈算法给的DFS模板,我又自己改进了一下,如下:

DFS模板一:
int search ( int n )
{
	if ( 符合输出最终解/边界条件 )
		输出操作;
	else
		for ( 遍历所有可能的情况 )
			if ( 符合判断条件 )
				{
					保存结果 mark[i]=1;
					继续深度搜索 search ( n+1 );
					回溯复原; 
				} 		 
} 

DFS模板二:
int search ( int n )
{
	for ( 遍历所有可能的情况 )
		if ( 符合判断条件 )
			{
				保存结果 mark[i]=1;
				if ( 符合输出最终解/边界条件 )
					输出操作;
				else 
					继续深度搜索 search ( n+1 );
				回溯复原; 
			} 		 
} 

这道题目好像只能DFS吧,就是每次放一个数字都检查是否与前一个数的和是素数,最后还要判断首尾相连的两个数。

这道题一开始贪图方便我用的i是全局变量,不知道为什么就死活运行不出来答案,然后检查了大概有1个多小时,最后小心翼翼地放入search里面就行了…不得不说挺迷的hhh

原来老师说的不到万不得已不要轻易用全局变量是对的hhh


代码:

#include <bits/stdc++.h>
using namespace std;

int search(int);
void print();
bool judge(int,int);

bool mark[21];
int a[21];
int ans=0;

int main()
{
	search(1);
	cout << "The total number is " <<ans;
	putchar('\n');
}

int search(int n)
{
	int i;
	for ( i=1; i<=20; i++ )
		if ( (!mark[i]) && judge(i,a[n-1]) )
		{
			a[n]=i;
			mark[i]=1;
			if ( n==20 )
				{	if ( judge(a[20],a[1]) )	print(); }
			else
				search(n+1);
			mark[i]=0;
		}
}

void print()
{
	ans++;
	int k;
	cout << "[Solution" << ans << "]:" << a[1];
	for ( k=2; k<=20; ++k )
		cout << " " << a[k]; 
	putchar('\n');
}

bool judge(int a, int b)
{
	int sum=a+b;
	int k;
	for ( k=2; k<=sqrt(sum); ++k)
		if ( sum%k==0 )
			return 0;
	return 1;
}

【一级讲解】素数环——DFS深度优先搜索