java实现求解n宫格

n宫格:奇数阶宫格,使用1-n×n填入其中,使得每一行、每一列、正斜线和反斜线上每n个数的和都相等。

解法:使用网上已有算法,具体见附录。


public class N_nine {
	
	public static void main(String[] args){
		
		solution(5);
	}
	
	public static void solution(int n){
		int[][] nine=new int[n][n];
		if(n%2==0){
			System.out.println("偶数格无法求解!");
			return;
		}
	
		int i,j;
		i=0;j=n/2;		
		
		int step;
		for(step=1;step<=n*n;++step){			
			nine[i][j]=step;
			//System.out.println(i+"  "+j+" step: "+step+" nine:"+nine[i][j]);
			i=i-1;
			j=j+1;
			if(i==-1 && j==n){
				i=i+2;
				j=j-1;
			}
			if(i==-1){
				i=n-1;
			}
			if(j==n){
				j=0;
			}
			if(nine[i][j]!=0){
				i=i+2;
				j=j-1;
			}
		}
		
		for(int ii=0;ii<n;++ii){
			for(int jj=0;jj<n;++jj){
				System.out.print(nine[ii][jj]+" ");
			}
			System.out.println();
		}
		
	}

}


附录:

九宫格题解法(此方法同样适用于二十五宫格

四十九宫格、八十一宫格)

 

九宫格涉及的数字少,怕讲不清楚,现以二十五宫格为例,讲解此类题的做法:

例题:请把1—25个数字放入下列空格中,要求做到横、纵、斜角相加均等于65 

(所给的数字如有负数或没有按顺序排列,请先把数字按从小到大的顺序进行排列)
第一步:最小的数必须放在最上一行的最中间格。  

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

第二步:第二小的数必须放在最小数所在列右列的最下格。

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

第三步:往右上格填写第三小的数,只要碰到最右列壁,就将下一个数填入上一行的最左侧格(如3碰到最右列壁后,4则填在上一行的最左侧格)。后面以此类推。

 

 

1

 

 

 

 

 

 

 

4

 

 

 

 

 

 

 

 

3

 

 

 

2

 

第四步:若右上方有格就一直填下一个数字,若右上方有数字就在上一个数字的下一格填下一个数,(如下图4的右上方有空格就填5,如5的右上方有空格就填6,但1早占了5右上格的位置,因此6就填在5的下一格)。后面以此类推。

 

 

1

8

 

 

5

7

 

 

4

6

 

 

 

 

 

 

 

3

 

 

 

2

 

第五步:在最上行碰壁后,下一个数要填入右列的最下格(如2、9的填法)。后面以此类推。

 

 

1

8

 

 

5

7

 

 

4

6

 

 

 

 

 

 

 

3

 

 

 

2

9

 

第六步:重复前面的规律。

 

 

1

8

15

 

5

7

14

 

4

6

13

 

 

10

12

 

 

3

11

 

 

2

9

第七步:右上角的下一个数,必定在其下一格。如16必定在15的下一格。

 

 

1

8

15

 

5

7

14

16

4

6

13

 

 

10

12

 

 

3

11

 

 

2

9

第八步:还是重复前面的规律。

17

24

1

8

15

23

5

7

14

16

4

6

13

20

22

10

12

19

21

3

11

18

25

2

9

 

此类题的规律:

 1、最小值永远在最上行的中间格,最大值永远在最下行的中间格。

2、最上行碰壁,下一个数填入右列最下格。  
3、最右列碰壁,下一个数填入上一行最左格。

4、右上格有空就一直填下一个数;右上格有数,就将下一个数字填入上一个数的下一格。 

5、右上角的下一个数,必定在其下一格;左下角的上一个数,必定在其上一格。

 

不知道讲明白没有。如果看懂了大家不妨用这个方法试试填9宫格、49宫格、81宫格。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值