现在的位置: 首页 > 综合 > 正文

回溯学习

2018年04月29日 ⁄ 综合 ⁄ 共 1372字 ⁄ 字号 评论关闭

/*
    搜素与回溯算法:
                搜索与回溯是计算机解题中常用的算法,很多问题无法根据某种确定的计算法则来求解,
            可以利用搜索与回溯的技术求解。回溯是搜索算法中的一种控制策略。
            它的基本思想是:为了求得问题的解,先选择某一种可能情况向前探索,在探索过程中,
            一旦发现原来的选择是错误的,就退回一步重新选择,继续向前探索,如此反复进行,
            直至得到解或证明无解。
                如迷宫问题:进入迷宫后,先随意选择一个前进方向,一步步向前试探前进,如果碰到死胡同,
            说明前进方向已无路可走,这时,首先看其它方向是否还有路可走,
            如果有路可走,则沿该方向再向前试探;如果已无路可走,则返回一步,
            再看其它方向是否还有路可走;如果有路可走,则沿该方向再向前试探。
            按此原则不断搜索回溯再搜索,直到找到新的出路或从原路返回入口处无解为止。


********************************************

递归回溯法算法框架[一]
int Search(int k)//当然,这里不仅仅局限于一个变量
 {
 for (i=1;i<=算符种数;i++)
  if (满足条件)
     {
    保存结果
    if (到目的地) 输出解;
              else Search(k+1);
    恢复:保存结果之前的状态{回溯一步}
     }
 }

递归回溯法算法框架[二]
int Search(int k)
 {
   if  (到目的地) 输出解;
   else
    for (i=1;i<=算符种数;i++)
     if  (满足条件)
       {
        保存结果;
                     Search(k+1);
        恢复:保存结果之前的状态{回溯一步}
       }
 }



***********************************************


*/

# include<cstdio>
# include<iostream>
# include<cstring>

using namespace std;

int a[21];
int vis[21];
int ans = 0;
int hash[30];

int is_prime( int x,int y )
{
    memset(hash,0,sizeof(hash));
    int l = x+y;
    hash[0] = 1;
    hash[1] = 1;
    for ( int i = 2;i < 30;i++ )
        {
            if (!hash)
                {
                    for ( int j = i*i;j < 30;j+=i )
                        {
                            hash[j] = 1;
                        }
                }
        }

    if ( hash[l] )
        return 0;
        else
            return 1;
}


int print()
{
    ans++;
    cout<<"<"<<ans<<">";
    for ( int j = 1;j <= 20;j++ )
        cout<<a[j]<<" ";
    cout<<endl;
}


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



int main(void)
{
    memset(a,0,sizeof(a));
    memset(vis,0,sizeof(vis));
    search(1);
    cout<<ans<<endl;

    return 0;
}

【上篇】
【下篇】

抱歉!评论已关闭.