六角填数(全排列-抓取法)

2023-10-22 06:30
文章标签 抓取 排列 填数 六角

本文主要是介绍六角填数(全排列-抓取法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 问题描述:

如图所示六角形中,填入1~12的数字。
使得每条直线上的数字之和都相同。
图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?

请通过浏览器提交答案,不要填写多余的内容(答案是10)

2. 思路分析:

① 对于这种填数字的我们首先要有一种全局的思维,因为这样的问题经典的解法是使用全排列去求解,套路是先生成所有的全排列然后在出口的时候使用check函数进行判断,因为数据规模还不是特别大,所以是可以使用全排列的递归求解出来的

② 对于题目中的数字我们是将其转化为一维数组来做的,所以可以将1-12的数字放入到一个整型数组中,这里使用抓取法去生成去全排列,即先声明一个标记元素是否被访问过的整型数组来判断当前当前是否已经被访问过,然后声明一个放结果的整型数组用来存在在递归求解的过程中生成的排列

③ 对图中的所有格子进行标号,分别从1-12从上到下进行标记,标记的目的是为了在出口的时候能够对生成的排列来判断六条直线的和是否满足题目的要求,这里可以使用一个check函数进行判断,判断成功之后那么我们需要再一次判断第一个,第二个,第十二个元素是否是1,8,3,如果是1,8,3那么直接输出到控制台上

④ 可以发现输出来的结果只有一个那么我们需要手工验证一下看结果是否正确

⑤ 在写传进数组下标和判断条件的时候要细心一点因为这里存在着多个的数组,容易写错

3. 具体的代码如下:

public class Main {static int count;static int visit[] = new int[13];static int res[] = new int[13];public static void main(String[] args) {int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};f(arr, 0);System.out.println(count);}private static void f(int[] arr, int k) {if(k == 12){if(check(res)){//进行筛选//注意这里容易写错if(res[1] == 1 && res[2] == 8 && res[12] == 3){for(int i = 1; i <= 12; i++){System.out.print(res[i] + " ");}System.out.println();}count++;}return;}for(int i = 1; i <= 12; i++){if(visit[i] == 0){visit[i] = 1;//注意这里容易出现错误res[k + 1] = arr[i - 1];f(arr, k + 1);//回溯visit[i] = 0;res[k + 1] = 0;}}}private static boolean check(int res[]) {//依次判断所有直线的结果是否是一样的int sum1 = res[1] + res[3] + res[6] + res[8];int sum2 = res[1] + res[4] + res[7] + res[11];int sum3 = res[8] + res[9] + res[10] + res[11];int sum4 = res[2] + res[3] + res[4] + res[5];int sum5 = res[2] + res[6] + res[9] + res[12];int sum6 = res[5] + res[7] + res[10] + res[12];if(sum2 != sum1) return false;if(sum3 != sum2) return false;if(sum4 != sum3) return false;if(sum5 != sum4) return false;if(sum6 != sum5) return false;return true;}
}

 

这篇关于六角填数(全排列-抓取法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/259685

相关文章

PHP抓取网站图片脚本

方法一: <?phpheader("Content-type:image/jpeg"); class download_image{function read_url($str) { $file=fopen($str,"r");$result = ''; while(!feof($file)) { $result.=fgets($file,9999); } fclose($file); re

PHP字符串全排列

方法一: $str = 'abc';$a =str_split($str);perm($a, 0, count($a)-1);function perm(&$ar, $k, $m) {if($k == $m){ echo join('',$ar), PHP_EOL;}else {for($i=$k; $i<=$m; $i++) {swap($ar[$k], $ar[$i]);perm($ar

回溯——9.全排列

力扣题目链接 给定一个 没有重复 数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 解题思路 问题建模:题目要求给出一个数组的所有排列组合,属于典型的全排列问题,这可以用回溯法来解决。回溯法通过递归的方式,依次将数组中的每个元素放入排列中,直到生成

用Java抓取CSDN主页上的图片

一,步骤一:获取网页源码 1,定义要爬取的页面的URL对象 //定义即将访问的链接String url="http://www.csdn.net";//获取CSDN的URL对象URL realURL = new URL(url); 2,获得这个链接的一个连接对象 URLConnection connection = realURL.openConnection();

代码随想录刷题day25丨491.递增子序列 ,46.全排列 ,47.全排列 II

代码随想录刷题day25丨491.递增子序列 ,46.全排列 ,47.全排列 II 1.题目 1.1递增子序列 题目链接:491. 非递减子序列 - 力扣(LeetCode) 视频讲解:回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列_哔哩哔哩_bilibili 文档讲解:https://programmercarl.com/0491.%E9%80%92%E

python 实现第k个字典排列算法

第k个字典排列算法介绍 "第k个字典排列"算法通常指的是在给定的字符集合(例如,字符串中的字符)中,找到所有可能排列的第k个排列。这个问题可以通过多种方法解决,但一个常见且高效的方法是使用“下一个排列”算法的变种,或称为“第k个排列”的直接算法。 方法一:使用“下一个排列”的变种 生成所有排列:首先生成所有排列,但显然这种方法对于较大的输入集合是不切实际的,因为它涉及到大量的计算和存储。 排序

C++解决:求排列数

描述 输入两个整数m,n,求m个数字中选n个数的排列数。(1<=n<=m<=50) 输入描述 两个正整数m和n。 输出描述 一个正整数表示排列数。 用例输入 1  6 5 用例输出 1  720 AC code #include<bits/stdc++.h>using namespace std;int fun(int n) {int sum=1;for(int i=n

【go语言爬虫】go语言高性能抓取手机号码归属地、所属运营商

一、需求分析 根据手机号码获取手机号码的归属地和所属运营商类型 类似:四川 18683339513 乐山 614000 0833 中国联通 二、运行效果 三、实现源代码 package main//网址:https://github.com/M2shad0w/phone-go//安装包:go get github.com/M2shad0w/phone-goimport ("fmt

【python爬虫】网贷天眼平台表格数据抓取

一、需求分析 抓取url: http://www.p2peye.com/shuju/ptsj/ 抓取字段: 昨日数据 排序 平台名称 成交额 综合利率 投资人 借款周期 借款人 满标速度 累计贷款余额 资金净流入 二、python爬虫源代码 # -*- coding:utf-8*-import sysreload(sys)sys.setdefaultencoding('utf-

【R语言爬虫】网贷天眼数据平台表格数据抓取2

一、需求分析 抓取url: http://www.p2peye.com/shuju/ptsj/ 昨日数据: 字段:排序 平台名称 成交额 综合利率 投资人 借款周期 借款人 满标速度 累计贷款余额 资金净流入 二、rvest爬虫实现源代码 rm(list=ls())gc()options(scipen = 200)library('rvest')timestart<-Sys