Prime Ring Problem HDU - 1016(回溯法)
本題用回溯法即可,下面有兩個版本,
版本1
#include <stdio.h>
#include <string.h>bool mark[21]; //mark[i]用於標記i+1是否被填充
int list[20];
int n; //總共的個數int prime[] = {3,5,7,11,13,17,19,23,29,31,37};
//判斷新插入的元素和前一個元素的和是否是素數
//注意,這裡x表示下標,值的範圍是從[1,n-1]
bool judge(int x)
{
int tmp = list[x] + list[(x-1)%n];
bool flag = false;
for(int i = 0; i < 11; i++)
if(tmp == prime[i])
{
flag = true;
break;
}
return flag;
}//用於判斷list[0]和list[n-1]
bool judgeSE()
{
int tmp = list[0] + list[n-1];
bool flag = false;
for(int i = 0; i < 11; i++)
if(tmp == prime[i])
{
flag = true;
break;
}
return flag;
}void print()
{
for(int i = 0; i < n; i++)
{
if(i == 0)
printf("%d", list[i]);
else
printf(" %d", list[i]);
}
printf("\n");
}//x表示下標,當前正在填充list[x]
void DFS(int x)
{
//判斷第一個和最後一個數是否滿足條件
if(x == n && judgeSE())
{
print();
return;
}
//將2和n之間的數填進list[x]中
for(int i = 2; i <= n; i++)
{
if(mark[i]) //如果i已經被填充
continue;
list[x] = i; //試探i填進list[x]
if(judge(x)) //判斷list[x]和list[x-1]是否滿足條件
{
mark[i] = true;
DFS(x+1);
mark[i] = false;
}
}
}int main()
{
int num = 1;
while(~scanf("%d", &n))
{
memset(mark, 0, sizeof(mark));
list[0] = 1;
mark[0] = true;
printf("Case %d:\n", num++);
DFS(1);
printf("\n");
}
return 0;
}
版本2
#include <stdio.h>
#include <string.h>bool mark[21]; //mark[i]用於標記i是否被填充
int list[21];
int n; //總共的個數int prime[] = {3,5,7,11,13,17,19,23,29,31,37};
bool judge(int x)
{
for(int i = 0; i < 11; i++)
if(x == prime[i])
return true;
return false;
}void print()
{
for(int i = 1; i <= n; i++)
{
if(i == 1)
printf("%d", list[i]);
else
printf(" %d", list[i]);
}
printf("\n");
}//x表示下標,當前正在填充list[x]
void DFS(int x)
{
//判斷第一個和最後一個數是否滿足條件
if(x == n+1 && judge(list[x-1] + list[1]))
{
print();
return;
}
//將2和n之間的數填進list[x]中
for(int i = 2; i <= n; i++)
{
if(mark[i]) //如果i已經被填充
continue;
list[x] = i; //試探i填進list[x]
if(judge(list[x] + list[x-1])) //判斷list[x]和list[x-1]是否滿足條件
{
mark[i] = true;
DFS(x+1);
mark[i] = false;
}
}
}int main()
{
int num = 1;
while(~scanf("%d", &n))
{
memset(mark, 0, sizeof(mark));
list[1] = 1;
mark[1] = true;
printf("Case %d:\n", num++);
DFS(2);
printf("\n");
}
return 0;
}