您的位置:首页 > 编程语言 > Java开发

五星填数--第六届蓝桥杯国赛JAVA B组第二题

2017-08-05 10:05 253 查看
标题:五星填数

如【图1.png】的五星图案节点填上数字:1~12,除去7和11。

要求每条直线上数字和相等。

如图就是恰当的填法。

请你利用计算机搜索所有可能的填法有多少种。

注意:旋转或镜像后相同的算同一种填法。
请提交表示方案数目的整数,不要填写任何其它内容。

思路:枚举遍历,我们从上到下依次放倒一个数组里,然后判断即可。

有一点就是,要排除旋转和镜像中重复的,不太明白为什么是除以10。。

求解答~~

package 总决赛;
import java.io.*;
public class 五星填数 {
static int[]n = new int[10];
static int num = 0;
static boolean vis[] = new boolean[12];
static boolean is_same(int[]a){
int b[] = new int[5];
b[0] = a[0]+a[2]+a[5]+a[8];
b[1] = a[0]+a[3]+a[6]+a[9];
b[2] = a[1]+a[5]+a[7]+a[9];
b[3] = a[4]+a[6]+a[7]+a[8];
b[4] = a[1]+a[2]+a[3]+a[4];
for(int i=0;i<5;i++)
for(int j=i;j<5;j++){
if(b[i] != b[j])
return false;
}
return true;
}
static void dfs(int[]a,int d){
if(d >= 10){
if(is_same(a))
num++;
return;
}
for(int i=1;i<=12;i++){//1-12数字
if(i == 7 || i == 11)
continue;
if(!vis[i-1]){
a[d++] = i;
vis[i-1] = true;
dfs(a,d);
d--;
vis[i-1] = false;
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
dfs(new int[10],0);
for(int i=0;i<12;i++){
vis[i] = false;
}
System.out.print(num/10);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: