搜索与回溯(c++)

新蒟蒻来CSDN了,希望大家可以多多关照欧!

谢谢大家!(鞠躬)

这是一篇石粉无聊有趣的题解

上来先给个小模版:
void s(int k)
{
	for(int i=1;i<=种数;i++)
	{
		if(满足条件)
		{
			保存结果;
			if(达到目的)
			{
			    输出解;
			}
			else s(k+1);
			退一步;(回溯一步)
		}
	}
}

就是先把每一种可能遍历一遍,如果满足条件,保存这一步的结果,判断:如果达成目的,就输出解。继续搜索下一步,歪到你姥姥家了找不到了就退,退回上一步。

现在插播一条回溯的基本知识!!!!!!

回溯,计算机算法,回溯法也称试探法,它的基本思想是:从问题的某一种状态(初始状态)出发,搜索从这种状态出发所能达到的所有“状态”,当一条路走到“尽头”的时候(不能再前进),再后退一步或若干步,从另一种可能“状态”出发,继续搜索,直到所有的“路径”(状态)都试探过。这种不断“前进”、不断“回溯”寻找解的方法,就称作“回溯法”。自己只会瞎编,复制借鉴的百度

典型例题(新人,比较菜,所以只有一道^~^):

素数环:

从1到20这20个数摆成一个环,要求相邻的俩个数的和是一个素数。

题目描述肥肠的简洁

思路:这是一道回溯题,20个空,一个个填,先填第一个。只要不与前面的数相同,并于相邻之数和为素数就可以啦!

stop,是不是可以用一下模板(坏笑)

代码来喽(有注释)
#include<bits/stdc++.h>
using namespace std;
int a[30],b[30];
void print()
{
	for(int j=1;j<=20;j++)
	{
		cout<<a[j]<<" ";//输出20个
	}
	cout<<endl;//换行
	return;
}
int sushu(int x,int y)//判断素数
{
	int z=x+y;
	if(z==0||z==1)//0和1
	return 0;
	for(int j=2;j*j<=z;j++)//从2开始遍历判断
	{
		if(z%j==0)
		return 0;
	}
	return 1;
}
//模板模版!!
void s(int k)//k指的是第k个位置
{
	for(int i=1;i<=20;i++)//20个可以填的数
	{
		if(sushu(a[k-1],i)==1&&b[i]==0)//如果i没被用过,而且i和前一个数的和是素数
		{
			a[k]=i;//记下来吧
			b[i]=1;
			if(k==20)
			{
				if(sushu(a[20],a[1])==1)//因为是环,所以判断第一个和最后一个
			    print();//输出
			}
			else s(k+1);
			b[i]=0;//回溯,让这个数不被占用
		}
	}
}
int main()
{
	s(1);
	return 0;
}

运行出许多中方案!!!

好多呢!

如果有错误,问题,希望大家可以给小蒟蒻及时指出,再次谢谢各位!!

看到这了,嘿嘿(*^▽^*)

给个关注,点个赞吧

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值