hdu1016

来源:互联网 发布:知乎 一出国就爱国 编辑:程序博客网 时间:2024/05/21 00:16

素数环问题,这道题是白皮书上的例子,在回溯法那节。

刚开始写搜索的题,菜鸟一只,很多都还不会。

//是不是两两互素之后剩下的两个也一定互素?no ,for example 1 2 3//显然算法不对。。。// 结果成功后结果是如何存储的 ?如何输出//#include<iostream>#include<cstring>#include<cstdio>using namespace std;int n;int vis[30];int a[30];int prime[]={2,3,5,7,11,13,17,19,23,29,31,37,39};bool pri[42];void dfs(int cur){    if(cur==n && pri[a[0]+a[n-1]])    {        for(int i=0;i<n-1;i++)        cout<<a[i]<<" ";        cout<<a[n-1]<<endl;    }    else    {        for(int i=2;i<=n;i++)        {            if(!vis[i] && pri[i+a[cur-1]])            {                a[cur]=i;                vis[i]=1;                dfs(cur+1);                vis[i]=0;            }        }    }}int main(){    int cas=1,i;    memset(pri,false,sizeof(pri));    for(i=0;i<13;i++)    if(prime[i])pri[prime[i]]=true;    while(~scanf("%d",&n))    {        cout<<"Case "<<cas++<<":"<<endl;        memset(vis,false,sizeof(vis));        a[0]=1;        dfs(1);        cout<<endl;    }}

另外,顺便也把书上的几个简单例子敲了一下

八皇后

#include<iostream>#include<cstdio>#include<cstring>using namespace std;int C[100];bool vis[3][100];int n,tot;void search(int cur){if(cur==n){tot++;return ;}for(int i=0;i<n;i++)//遍历每一列 {int flag=1;C[cur]=i;        for(int j=0;j<cur;j++){if(C[j]==C[cur] || j-C[j]==cur-C[cur] || j+C[j]==cur+C[cur]){flag=0;break;}}     if(flag)search(cur+1);}}void huisu(int cur){if(cur==n){tot++;return ;}else for(int i=0;i<n;i++){if(!vis[0][i] && !vis[1][cur+i] && !vis[2][cur-i+n]){vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1;search(cur+1);vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0;}}}int main(){scanf("%d",&n);search(0);cout<<tot<<endl;} 
困难的串

这个题,判断是否有相同的子串那有点不太好懂,基础太差,看这些还是要想一想,可能过两天就又忘了。。。。

j 代表长度为j*2的后缀


#include<iostream>#include<cstdio>#include<cstring>using namespace std;int n,l;int c[100];int dfs(int cur){if(cur==n){for(int i=0;i<n;i++)printf("%c",'A'+c[i]);    cout<<endl;return 0;}     else for(int i=0;i<l;i++)     {     int flag=1;     c[cur]=i;     //cout<<i<<endl;      for(int j=1;j*2<=cur+1;j++)     {     //cout<<j<<endl;     int equal=1;     for(int k=0;k<j;k++)     {     //cout<<cur-k<<" "<<cur-k-j<<endl;     if(c[cur-k]!=c[cur-k-j])     {     equal=0;     break;     }     }     if(equal){flag=0;break;}     }     if(flag)if(!dfs(cur+1))return 0;     }     return 1;}int main(){while(~scanf("%d%d",&n,&l)){c[0]=0;dfs(1);}} 


0 0
原创粉丝点击