坑爹的是一开始以为题目给的“度”d, 只是要求每d个数之和不为素数即可;结果被坑了,原来是要求从2、3、....、d都要成立;这样,每加入一个数,就要判断一次;
// Problem#: 1002
// Submission#: 1378268
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
/* entry 用于存放排列后的元素
**visited 用于表示序列元素是否已被访问
**isPrime 数组用于存放1-9956之间是否为素数的信息
**/
vector<int> entry;
bool visited[1001];
bool isPrime[9956];/**9955 为991-1000之和/
/*找出1-1000 之间的素数*/
void Prime()
{
/*先假设全部为素数*/
memset(isPrime, 1, sizeof(isPrime));
isPrime[0] = 0;
isPrime[1] = 0;
for(int i = 2; i <= 9956; i++)
{
/*只要某个数可以由其余两个数相乘获得,其即不可能为素数*/
for(int j = i; j <= 9956/i; j++)
{
isPrime[i * j] = 0;
}
}
}
/*检查目前排好的元素 entry是否满足条件
**interval 表示度
**返回值的真假表示是否符合题意
**/
bool Check(int interval)
{
int i, j;
int sum = entry.back();
for(i = 1;i < interval && i < entry.size(); i++)
{ /*求和*/
sum = sum + entry[entry.size() - i - 1];
/*如果出现和为素数,则停止循环*/
if(isPrime[sum])
return false;
}
return true;
}
//void printEntry()
//{
// for(int i = 0; i < entry.size(); i++)
// cout << entry[i] << " ";
// cout << endl;
//}
/*深度优先搜索
**start表示序列的起始位置
**interval 表示度
**/
bool DFS(bool visited[], int start, int entryNum, int interval)
{
if(entry.size() == entryNum)
if(Check(interval))//排列好的元素个数已足
return true;
else
return false;
/*对序列的访问*/
for(int i = start; i < start + entryNum; i++)
{
if(!visited[i])
{
/*如果该数未被访问, just do it*/
visited[i] = true;
entry.push_back(i);//加入结果之中
/*为了使后面的pop 操作正确运行*/
if(entry.size() > 1)//if(entry.size() >= interval)
{
if( Check(interval) && DFS(visited,start,entryNum, interval))//如果当前的结果符合题意,并且,后续的搜索也成立,则最终结果正确
{
return true;
}
else//当前这个数不适合在最终结果的这个位置上,因为上面的检测不通过
{
entry.pop_back();
visited[i] = false;//给予再次访问的可能
}
}
else
{
if(DFS(visited,start,entryNum, interval))//即使目前结果有的元素个数不足以interval 那么长,但是目前的几个数可以与后面的排序情况组成一个正解
return true;
else
{
entry.pop_back();
visited[i] = false;
}
}
}
}
return false;
}
int main()
{
int start, end, interval;
Prime();/*获得素数表*/
while(cin >> start >> end >> interval && start != 0 && end != 0 && interval != 0)
{
/*entryNum 存放序列的元素的个数*/
int entryNum = end - start + 1;
memset(visited, true, sizeof(visited));
/*将存在于序列中的元素初始化为未访问*/
for(int i = start; i <= end; i++)
{
visited[i] = 0;
}
if(DFS(visited,start,entryNum, interval))
{
for(int i = 0; i < entry.size(); i++)
{
cout << entry[i] ;
if(i != entry.size() - 1)
cout << ",";
}
cout << endl;
}
else
cout << "No anti-prime sequence exists." << endl;
//将结果清空
entry.clear();
}
return 0;
}