dfs :prime ring problem

A - Prime Ring Problem

 HDU - 1016 

#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int n;
int a[100];
int vis[100];
int num;
int prime(int c){
    for(int m=2;m<=sqrt(c);m++){
        if(c%m==0) return 0;
    }
    return 1;
}
void dfs(int i){
    int he;
    int flag;
    if(i==n&&prime(a[0]+a[n-1])){
        for(int m=0;m<n;m++){ 
        if(m<n-1)
        cout<<a[m]<<" ";
        else cout<<a[m]; 
    }
    cout<<endl;
    return;
}
    for(int j=2;j<=n;j++){
        he=a[i-1]+j;
        flag=prime(he);
        if(vis[j]==0&&flag){
            vis[j]=1;
            a[i]=j;
            dfs(i+1);
            vis[j]=0;
        }
    }
    return;
}
int main(){
    while(cin>>n){
        cout<<"Case "<<++num<<":"<<endl;
        memset(a,0,sizeof(a));
        memset(vis,0,sizeof(vis));
        a[0]=1;
        dfs(1);
        cout<<endl;
    }
}

这个题严格遵顼dfs模板,做这道题的时候栽在了判断临界条件的时候

如果传入的i的初值是1的时候,在判断he为素数的时候会出现i-1,所以a[1]存的是第二个数,所以假设我们传入的n为6时,当i=6时,如果不进入if语句,此时i已经经历了等于1 2 3 4 5 的搜索,vis数组在每一次都会被标记,而且规定的vis数组是2到6一共5个位置,此时已经没有多余的位置了,已经进不了if语句了,所以在这种情况下 i 的临界条件是==,想法是这样的,具体还和传入的 i 的初值和 j 的设立有关

还有就是这个题对输出格式的要求,每两个数之间用空格,最后一个数没有空格,且每一组案例结束之后要空一行,容易忽略。

猜你喜欢

转载自www.cnblogs.com/ZJK132/p/12606831.html