暴力求解法 C++详解——相信你看完会有收获的

目录

 

一、枚举排列——递归枚举 / next_permutation

1.生成1~n的全排列

2.生成输入的n个数的全排列

二、回溯法

1.N皇后问题

2.素数环


一、枚举排列——递归枚举 / next_permutation

1.生成1~n的全排列

#include<stdio.h>
void print_permutation(int n,int A[],int cur)
{
	int i,j,ok;
	if(cur==n)					//递归出口 
	{
		for(i=0;i<n;i++)
			printf("%d ",A[i]);
		printf("\n");
	}
	else
	{
		for(i=1;i<=n;++i)			
		{
			ok=1;				//检查标记 
			for(j=0;j<cur;j++)		//检查i是否已经出现在数组A[]中 
			{
				if(A[j]==i)
					ok=0;
			}
			if(ok)
			{
				A[cur]=i;
				print_permutation(n,A,cur+1);	
			}
		}
	}
}

int main()
{
	int n;
	scanf("%d",&n);
	int A[n];
	print_permutation(n,A,0);	
	return 0;
}

2.生成输入的n个数的全排列

/*
next_permutation包含于#include<algorithm>
函数原型:bool next_permutation(iterator start,iterator end)
next_permutation(a,a+n)函数对数组a中的前n个元素进行全排列,同时改变a数组
next_permutation()在使用前需要对欲排列数组按升序排序  
*/
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
	int n,i;
	scanf("%d",&n);
	int a[n];
	for(i=0;i<n;++i)
	{
		scanf("%d",&a[i]);
	}
	sort(a,a+n);
	do
	{
		for(i=0;i<n;++i)
		{
			printf("%d ",a[i]);
		}
		printf("\n");
	}while(next_permutation(a,a+n));
	return 0;
} 

二、回溯法

1.N皇后问题

N皇后问题三种写法详解

2.素数环

/*
素数环
输入整数n,把整数1,2,3…,n组成一个环,使得相邻两个整数之和均为素数。
输出时从1开始逆时针排序。同一个环应恰好输出一次。n<=16.
样例输入:
6
样例输出:
1 4 3 2 5 6
1 6 5 2 3 4 
*/ 
#include<bits/stdc++.h>
using namespace std;
int Ring[16],visited[17];		
int n;
bool is_prime(int n)					//判断是否为素数 
{
	int i;
	for(i=n-1;i>1;--i)
	{
		if(n%i==0)
			return false;
	}
	return true;
}
void dfs(int cur)
{
	int i;
	if(cur==n&&is_prime(Ring[0]+Ring[n-1]))		//检查素数环首尾 
	{
		for(i=0;i<n;++i)
			printf("%-4d",Ring[i]);
		printf("\n");
	}
	else if(cur==0)					//整数1开始排列,防止输出相同的素数环 
	{
		visited[1]=1;
		Ring[0]=1;
		dfs(cur+1);
		Ring[0]=0; 
	}
	else
	{
		for(i=1;i<=n;i++)
		{
			if(!visited[i]&&is_prime(i+Ring[cur-1]))	
			{
				Ring[cur]=i;
				visited[i]=1;
				dfs(cur+1);
				visited[i]=0;
			}
		}
	}
}
int main()
{
	scanf("%d",&n);
	dfs(0);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枯木何日可逢春

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值