黑花瞎子吃醋惩罚花爷:设计程序将1-20这20个数放到一个环上,使得环上任意两个相邻数之和为素数

来源:百度文库 编辑:中科新闻网 时间:2024/05/03 07:55:18
要求用C语言编写,递归思想
急于知道,高手们拉一把~~~~~~~~~~

#include<iostream.h>
using namespace std;
bool IsPrime(int k) //判断是不是素数,针对本题目
{
int a[] = {3,5,7,11,13,17,19,23,29,31,37};
for(int i=0;i<12;i++)
{
if(a[i]==k)
return true;
}
return false;
}
bool InSolve(int k,int *a,int m) //判断数k是不是已经插入到环中了
{
for(int i=0;i<m;i++)
{
if(k==*(a+i))
return true;
}
return false;
}
void out(int *a,int m) //测试用输出函数
{
for(int i=0;i<m;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
bool Solve(int n,int *a) //递归求解
{
if(n==20) //开始
{
*a = 20; //把20插入到环中
return Solve(n-1,a); //递归
}
for(int i=19;i>0;i--) //把剩下的数插入到环中
{
if(!InSolve(i,a,20-n)) //如果i没在环中
{
if(IsPrime(i+*(a+20-n-1))) //符合题目要求
{
*(a+20-n) = i;
out(a,20-n+1);
if(Solve(n-1,a)) //递归
return true;
}
}
}
return false;
}
int main()
{
int a[20];
if(Solve(20,a))
{
out(a,20);
}
else
cout<<"There's no Result!\n";
return 0;
}
ps:效率比较差