题目位置:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=465
Prime Ring Problem |
A ring is composed of n (even number) circles as shown in diagram. Put natural numbers into each circle separately, and the sum of numbers in two adjacent circles should be a prime.
Note: the number of first circle should always be 1.
You are to write a program that completes above process.
6 8
Case 1: 1 4 3 2 5 6 1 6 5 2 3 4 Case 2: 1 2 3 8 5 6 7 4 1 2 5 8 3 4 7 6 1 4 7 6 5 8 3 2 1 6 7 4 3 8 5 2
#include <stdio.h> #include <math.h> #include <string.h> bool is_p(int x){ for(int i=2;i<=sqrt(x);i++){ if(x%i==0) return false; } return true; } int map[20],n;//存数字 bool vis[20]; void dfs(int x){ if(x==n&&is_p(map[0]+map[n-1])){ printf("%d",map[0]); for(int i=1;i<n;i++) printf(" %d",map[i]); printf("\n"); } for(int i=2;i<=n;i++){ if(vis[i]==true) continue; if(is_p(i+map[x-1])){ map[x]=i; vis[i]=true; dfs(x+1); vis[i]=false; } } } int main(){ int kase=0; while(scanf("%d",&n)!=EOF){ memset(vis,false,sizeof(vis)); if(kase) printf("\n"); printf("Case %d:\n",++kase); map[0]=1; vis[0]=true; dfs(1); } return 0; }
if(x==n&&is_p(map[0]+map[n-1])){注意这里,是遇到x==n的时候成立,开始想着判断n-1,然后后面就复杂了……
这里是仿照了n皇后问题,递归只和前面的比较,只要加上最后一次的判断就可以了^_^