素数圆环
时间限制: 1 Sec 内存限制: 32 MB
题目描述
输入
输入包含多组测试数据。每组输入占一行,为整数n(0 < n<20),表示圆圈数。
输出
样例输入
样例输出
题意概括
给出一个数字n求使用1-n这n个数字组成一个素数环,第一个必须是1;
解题思路
这个题我是用的dfs暴力求解的。枚举所有情况,看哪一种情况符合就输出哪一种情况。
代码如下
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f using namespace std; int aa[50]; int line[30],n; int vis[30]; int date[20][30]; int sushu (int x) { int i; int k=(int)sqrt(x); for(i=2;i<=k;i++) if(x%i==0) return 0; return 1; } /*void dfs(int x) { printf("%d",line[x-1]); int i; if(x>n){ printf("*\n"); //if(date[line[n]][0]==1) // return ; printf("%d",line[1]); for(i=2;i<=n;i++){ printf(" %d",line[i]); } printf("\n"); return ; } for(i=0;date[line[x-1]][i]<=n;i++){ if(vis[date[line[x-1]][i]]==0) { vis[date[line[x-1]][i]]=1; line[x]=date[line[x-1]][i]; dfs(x+1); vis[date[line[x-1]][i]]=1; } } }*/ void dfs(int x) { int i; if(x>n){ if(aa[line[n]+1]==0) return ; printf("%d",line[1]); for(i=2;i<=n;i++) printf(" %d",line[i]); printf("\n"); return ; } for(i=0;date[line[x-1]][i]<=n;i++){ if(vis[date[line[x-1]][i]]==0){ vis[date[line[x-1]][i]]=1; line[x]=date[line[x-1]][i]; dfs(x+1); vis[date[line[x-1]][i]]=0; } } } int main () { int i,j,k; memset(aa,0,sizeof(aa)); memset(date,inf,sizeof(date)); for(i=3;i<=50;i++){ if(sushu(i)) aa[i]=1; } for(i=1;i<20;i++){ //printf("%d::",i); for(j=1,k=0;j<20;j++){ if(aa[i+j]){ date[i][k]=j; k++; // printf("%d ",date[i][k-1]); } } //printf("\n"); } int l=0; while(~scanf("%d",&n)){ l++; memset(vis,0,sizeof(vis)); vis[1]=1; line[1]=1; printf("Case %d:\n",l); dfs(2); printf("\n"); } return 0; }
转载于:https://www.cnblogs.com/lanaiwanqi/p/10445728.html
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/211716.html原文链接:https://javaforall.net
