反幻方java

反幻方


我国古籍很早就记载着

2 9 4
7 5 3
6 1 8

这是一个三阶幻方。每行每列以及对角线上的数字相加都相等。

下面考虑一个相反的问题。
可不可以用 1~9 的数字填入九宫格。
使得:每行每列每个对角线上的数字和都互不相等呢?

这应该能做到。
比如:
9 1 2
8 4 3
7 5 6

你的任务是搜索所有的三阶反幻方。并统计出一共有多少种。
旋转或镜像算同一种。

比如:
		9 1 2
		8 4 3
		7 5 6
		
		7 8 9
		5 4 1
		6 3 2
		
		2 1 9
		3 4 8
		6 5 7

等都算作同一种情况。

请提交三阶反幻方一共多少种。这是一个整数,不要填写任何多余内容。
//答案是3120
import java.util.Scanner;
public class Main{
  static int[] arr= {1,2,3,4,5,6,7,8,9}; // 枚举数组
  static int[] vis = new int[arr.length]; //标记数组
  static int[] m = new int[arr.length]; //排列组合 数组
  static int count = 0;
  public static void main(String[] args){
      dfs(0);
      //初8是应为,旋转4个+镜像2个
      System.out.println(count/8);
  }

  public static void dfs(int k){

      if(k==arr.length){
      //下面是检测是否每个位置都不相等
          boolean flag = true;
          int row1 = m[0]+m[1]+m[2];
          int row2 = m[3]+m[4]+m[5];
          int row3 = m[6]+m[7]+m[8];
          int col1 = m[0]+m[3]+m[6];
          int col2 = m[1]+m[4]+m[7];
          int col3 = m[2]+m[5]+m[8];
          int xie1 = m[0]+m[4]+m[8];
          int xie2 = m[2]+m[4]+m[6];
          int[] p = {row1,row2,row3,col1,col2,col3,xie1,xie2};
          for(int i=0; i<p.length; ++i)
              for(int j=i+1; j<p.length; ++j){
                  if(p[i]==p[j]){
                      flag = false;
                      break;
                  }
                  if(!flag)
                      break;
              }
          if(flag)
              count++;
          return;
      }
      //这里是试探-回溯的过程,全排列
      for(int i=0; i<9; ++i){
          if(vis[i] == 0){
              vis[i] = 1;
              m[k] = arr[i];
              dfs(k+1);
              vis[i] = 0;
          }
      }
  }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值