Search Problems,用Dfs做的。一开始说超时,于是把cout全都改成printf,还是超时。后来看了网上说的,把奇数去掉了,剪枝,果然不超时了。最后又是各种PE,改了半天,看了网上的代码,才改对。这题PE我觉得应该是题目错的吧
//ZOJ1457Prime Ring Problem
#include <iostream>
#include <stdio.h>
#include <memory.h>
#define DEBUG
#define MAX_NUM 20
using namespace std;
const int Prime[13] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41};
int Ring[MAX_NUM + 1] = {0}, RingPtr = 0, TotalUsed = 0;
bool isUsed[MAX_NUM + 1] = {false};
void Dfs(int max_num)
{
bool is_prime;
if (TotalUsed == max_num)
{
is_prime = false;
for (int i = 0; i < 13; i ++)
{
if (Ring[max_num - 1] + 1 == Prime[i])
{
is_prime = true;
break;
}
}
if (is_prime == false)
{
return;
}
for (int i = 0; i < max_num; i ++)
{
//cout << Ring[i];
printf("%d", Ring[i]);
if (i < max_num - 1)
{
//cout << " ";
printf(" ");
}
}
//cout << endl;
printf("\n");
return;
}
for (int i = 1; i <= max_num; i ++)
{
is_prime = false;
if (isUsed[i] == true)
{
continue;
}
for (int j = 0; j < 13; j ++)
{
if (Ring[RingPtr - 1] + i == Prime[j])
{
is_prime = true;
break;
}
}
if (is_prime == false)
{
continue;
}
Ring[RingPtr] = i;
RingPtr ++;
isUsed[i] = true;
TotalUsed ++;
Dfs(max_num);
RingPtr --;
Ring[RingPtr] = 0;
isUsed[i] = false;
TotalUsed --;
}
}
int main(int argc, char *argv[])
{
int max_num, case_num;
case_num = 0;
while (cin >> max_num)
{
case_num ++;
//if (case_num > 1/* && max_num % 2 == 1*/)
//{
//cout << endl;
// printf("\n");
//}
//cout << "Case " << case_num << ":" << endl;
printf("Case %d:\n", case_num);
if (max_num % 2 == 1)
{
printf("\n");
continue;
}
Ring[0] = 1;
RingPtr = 1;
memset(isUsed, 0x00, sizeof(isUsed));
isUsed[1] = true;
TotalUsed = 1;
Dfs(max_num);
printf("\n");
}
return 0;
}