深搜 回溯
bool isprimer(int tt) //判断该数是否为质数 { if (tt == 2||tt == 3) { return true; } else if (tt == 1||tt%2 == 0) return false; for (int i = 2;i <= sqrt(static_cast<double>(tt));++i) { if (tt%i == 0) return false; } return true; } bool test(int a[],int dp,int val) //在位置dp上加入val 是否符合相邻为质数的条件 { switch (dp) { case 0: return true; case 1: case 3: return isprimer(val + a[0])?1:0; case 2: return isprimer(val + a[1])?1:0; case 4: return (isprimer(val + a[1])&&isprimer(val + a[3]))?1:0; case 5: return (isprimer(val + a[2])&&isprimer(val + a[4]))?1:0; case 6: return isprimer(val + a[3])?1:0; case 7: return (isprimer(val + a[6])&&isprimer(val + a[4]))?1:0; case 8: return (isprimer(val + a[5])&&isprimer(val + a[7]))?1:0; } return true; } const int n = 9; void dfs(int a[],int num[],int len,bool ch[],int dp) //深搜 回溯 num中包含符合条件的len个数 ch为判断该数是否已选(防止重复选) { if (dp == n) { for (int i = 0;i < 3;++i) { for (int j = 0;j < 3;++j) { cout<<a[i*3 + j]<<' '; } cout<<endl; } system("pause"); return; } for (int i = 0 ; i < len;++i) { if (!ch[i]&&test(a,dp,num[i])) { ch[i] = true; a[dp] = num[i]; dfs(a,num,len,ch,dp + 1); ch[i] = false; } } } int main() { int a[n]; const int len = 15; int num[len]; bool ch[len]; memset(ch,0,sizeof(ch)); for (int i = 0;i < len;++i) { num[i] = i + 1; } dfs(a,num,len,ch,0); return 0; }