您的位置:首页 > 其它

(HDU 1016) Prime Ring Problem

2016-05-24 15:29 387 查看
(HDU 1016) Prime Ring Problem

思路:

素数环,用数组来存储,相邻的两个数a[x] + a[x-1]要为素数;

DFS, a[0] = 1, 从位置1开始尝试填入数字,填入的数字和前一个数字之和要为素数且填过数字不能重复,直到a[n-1]放好数字之后, 判断a[n-1]+a[0]是否为素数,如果是则输出结果。

代码:

import java.util.Arrays;
import java.util.Scanner;

public class Main{
public static int a[];
public static boolean vis[];
public static int prime[] = new int[50];
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
gernerate_prime();//生成素数表
int cnt = 0;
while(in.hasNext()){
cnt++;
int n = in.nextInt();
a = new int
;
vis = new boolean[n+1];
a[0] = 1;
vis[1] = true;
System.out.println("Case "+cnt+":");
dfs(1, n);
System.out.println();
}
}
private static void dfs(int i, int n) {
if(i == n && prime[a[n-1] + a[0]] == 1){
for(int j = 0; j < n-1; j++)
System.out.print(a[j]+" ");
System.out.println(a[n-1]);
return ;
}

for(int j = 1; j <= n; j++){
if(!vis[j] && prime[j+a[i-1]] == 1){ //判断数字是否填过,并且这个数字填入是否和前面数字之和为素数
vis[j] = true;
a[i] = j;
dfs(i+1, n);
vis[j] = false;
}
}
}
private static void gernerate_prime() {
int size = prime.length - 1;
Arrays.fill(prime, 1);
prime[1] = 0;
prime[2] = 1;
for(int i = 2; i < size; i++){
if(prime[i] == 1){
for(int j = i + i; j < size; j += i)
prime[j] = 0;
}
}
}
}


相似题目:

HDU 1015 Safecracker

用大小为5数组的存放数字,可选数字有12个,和上面一样先放0位置,直到5位置填充,判断是否符合题目条件v - w^2 + x^3 - y^4 + z^5 = target

5个位置5层循环也可以代码:

import java.util.Arrays;
import java.util.Scanner;

public class Main{
public static char a[];
public static char c[];
public static boolean ans;
public static boolean vis[];
public static void main(String[] args) {
Scanner in = new Scanner(System.in);

while(in.hasNext()){
int n = in.nextInt();
String s = in.next();
if(n == 0 && s.equals("END"))
break;
c = s.toCharArray();
a = new char[5];
vis = new boolean[c.length];
Arrays.sort(c);
ans = false;
dfs(0, 5, n);
if(ans){
for(int i = 0; i < 5; i++)
System.out.print(a[i]);
System.out.println();
}
else
System.out.println("no solution");
}
}

private static void dfs(int i, int n, int target) {
if(i == n){
int sum = 0;
for(int j = 0; j < 5; j++){
sum += pow(a[j]-'A'+1, j+1);
}
if(target == sum)
ans = true;
return ;
}

for(int j = c.length-1; j >= 0; j--){
if(!vis[j]){
vis[j] = true;
a[i] = c[j];
dfs(i+1, n, target);
if(ans)
return ;

vis[j] = false;
}
}
}

private static int pow(int x, int n) {
int sum = 1;
for(int i = 0; i < n; i++)
sum *= x;

if((n&1) == 1)
return sum;
else
return -sum;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: