新蒟蒻来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;
}
运行出许多中方案!!!
好多呢!
如果有错误,问题,希望大家可以给小蒟蒻及时指出,再次谢谢各位!!
看到这了,嘿嘿(*^▽^*)
给个关注,点个赞吧