A - Prime Ring Problem
#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 的设立有关
还有就是这个题对输出格式的要求,每两个数之间用空格,最后一个数没有空格,且每一组案例结束之后要空一行,容易忽略。