六角幻方—题解

标题:六角幻方

    把 1 2 3 ... 19 共19个整数排列成六角形状,如下:


    * * *
   * * * *
  * * * * *
   * * * * 
    * * *


    要求每个直线上的数字之和必须相等。共有15条直线哦!


    再给点线索吧!我们预先填好了2个数字,第一行的头两个数字是:15 13,参见图【p1.png】,黄色一行为所求。


    请你填写出中间一行的5个数字。数字间用空格分开。

    这是一行用空格分开的整数,请通过浏览器提交答案,不要填写任何多余的内容(比如说明性的文字等)


解题思路:      DFS


源代码:






/**
 * 
 *  六角幻方搜索
 * 
 *
 */

public class Main1
{
	static int table[] = {1,2,3,4,5,6,7,8,9,10,11,12,14,16,17,18,19}; //内容
	public static void main(String[] args)
	{
		int arr[] = new int[17];
		boolean step[]= new boolean[20];
		step[15] = step[13] = true;
		
		dfs(arr, 0, step);
	}
	
	private static void dfs(int[] arr, int ws, boolean[] step)
	{
		if (ws == 5)
		{
			if (28 + arr[0] != arr[1] + arr[2] + arr[3] + arr[4])return;
		}
		if (ws == 6)
		{
			if (28 + arr[0] != 15 + arr[1] + arr[5]) return ;
		}
		if (ws == 10)
		{
			if (28 + arr[0] != arr[5] + arr[6] + arr[7] + arr[8] + arr[9])return;
		    if (28 + arr[0] != arr[0] + arr[4] + arr[9]) return;
		}
		if (ws == 11)
		{
			if (28 + arr[0] != 13 + arr[2] + arr[6] + arr[10]) return;
		}
		if (ws == 14)
		{
			if (28 + arr[0] != arr[10] + arr[11] + arr[12] + arr[13])return;
			if (28 + arr[0] != 13 + arr[3] + arr[8] + arr[13]) return;
		}
		if (ws == 15)
		{
			if (28 + arr[0] != arr[5] + arr[10] + arr[14]) return;
			if (28 + arr[0] != arr[0] + arr[3] + arr[7] + arr[11]+arr[14])return;
		}
		if (ws == 17)
		{
			if (28 + arr[0] != arr[14] + arr[15]+arr[16]) return;
			if (28 + arr[0] !=15+ arr[2]+arr[7] + arr[12]+arr[16]) return;
			if (28 + arr[0] != arr[9] + arr[13] + arr[16]) return;
			
			output(arr);return;
		}
		 for (int i = 0; i < table.length; i++)
		 {
			if (step[table[i]] == false)
			{
				step[table[i]] = true; 
				arr[ws] = table[i];
				dfs(arr, ws+1, step);
				step[table[i]] = false;
			}
		 }
	}

	private static void output(int[] arr)
	{
         for (int i = 0; i < arr.length; i++)
         {
        	 System.out.print(arr[i] + " ");
         }
	     System.out.println();
	}
}


  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值