欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Prime Ring Problem HDU - 1016

程序员文章站 2022-05-21 08:44:00
...

这道题是比较典型的dfs,在这里总结一下dfs的模板思路:
1、给dfs一个初始进入点
2、对后面的点进行一个遍历
3、对符合要求的点进行下一步的dfs(注意此层dfs结束后要释放flag)
4、设定return条件

这道题还有一个比较恶心的地方,杭电的oj每一个答案的最后不能带空格,不然一直判输出格式错误,代码中有注释。

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;

int n;
int one[41]={0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0};
int ans[23]={0};
int flag[30]={0};
int x=1,y=1;


void dfs(int num){
    if(num==n+1 && one[ans[num-1]+ans[1]]==1){
        for(int i=1; i<=n; i++){
            if(i>1)
                cout<<" ";//加入这个
            cout<<ans[i];
        }
        cout<<endl;

    }
        for(int i=2; i<=n; i++){

            if(flag[i]==0 && one[i+ans[num-1]]==1){
                ans[num] = i;
                flag[i] = 1;
                dfs(num+1);
                flag[i]=0;
            }
        }
}


int main(){
    //scanf("%d", &n);
    int temp=1;
    while(cin>>n){
        cout<<"Case "<<temp<<":"<<endl;
        ans[1] = 1;
        memset(flag, 0, sizeof(flag));
        dfs(2);
        temp++;
        cout<<endl;
    }
}