第七届蓝桥杯JavaB组——第6题方格填数

解决方案:利用全排列和递归

使用Java中的集合API:HashMap ArrayList

第七届蓝桥杯JavaB组——第6题方格填数

package com.lzp.lanqiaoseven.p6;

import java.util.*;

/**
* @Author LZP
* @Date 2021/2/26 14:38
* @Version 1.0
*
*
方格填数 如下的10个格子
+--+--+--+
| | | |
+--+--+--+--+
| | | | |
+--+--+--+--+
| | | |
+--+--+--+ (如果显示有问题,也可以参看本篇博文开头) 填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻) 一共有多少种可能的填数方案? 请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。 全排列
*/
public class Main { private static int[] arr = new int[11]; /**
* 辅助数组
*/
private static int[] dp = new int[10]; private static int count; private static Map<Integer, List<Integer>> map = null; private static List<Integer> list= null; public static void main(String[] args) {
map = new HashMap<>();
list= new ArrayList<>();
list.add(2);
list.add(4);
list.add(5);
list.add(6);
map.put(1, list); list= new ArrayList<>();
list.add(1);
list.add(3);
list.add(5);
list.add(6);
list.add(7);
map.put(2, list); list= new ArrayList<>();
list.add(2);
list.add(6);
list.add(7);
map.put(3, list); list= new ArrayList<>();
list.add(1);
list.add(5);
list.add(8);
list.add(9);
map.put(4, list); list= new ArrayList<>();
list.add(1);
list.add(2);
list.add(4);
list.add(6);
list.add(8);
list.add(9);
list.add(10);
map.put(5, list); list= new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(5);
list.add(7);
list.add(9);
list.add(10);
map.put(6, list); list= new ArrayList<>();
list.add(2);
list.add(3);
list.add(6);
list.add(10);
map.put(7, list); list= new ArrayList<>();
list.add(4);
list.add(5);
list.add(9);
map.put(8, list); list= new ArrayList<>();
list.add(4);
list.add(5);
list.add(6);
list.add(8);
list.add(10);
map.put(9, list); list= new ArrayList<>();
list.add(5);
list.add(6);
list.add(7);
list.add(9);
map.put(10, list); division(1);
System.out.println(count);
} public static void division(int pos) {
if (pos > 10) {
boolean flag = true;
for (int i = 1; i < arr.length; i++) {
List<Integer> values = map.get(i);
for (int j = 0; j < values.size(); j++) {
int temp = arr[values.get(j)];
if (arr[i] - 1 == temp || arr[i] + 1 == temp) {
// 两数连续
flag = false;
break;
}
}
if (!flag) {
break;
}
}
if (flag) {
count++;
}
return;
} for (int i = 0; i <= 9; i++) {
if (dp[i] == 0) {
dp[i] = 1;
arr[pos] = i;
division(pos + 1);
dp[i] = 0;
}
}
}
}

运行结果:

第七届蓝桥杯JavaB组——第6题方格填数

感悟:一开始总以为各个方格可以填写重复的数,然后用代码实现的时候发现结果好长时间都没运行出来,这时就反过来思考,这毕竟是一个结果填空题,题目应该不至于那么复杂,然后就再试了一下将0~9这10个数字依次不重复的填入所有方格,也就是每个方格的数都不能相同(即每个数只能用一次),最后程序竟然跑出结果来了。于是就去网上看下网友的答案,发现我俩的答案是一样的,我觉得没那么巧,答案应该是没有错,我还是不放心,就再搜了几篇博客再验证一下。终于功夫不负有心人,都对上了哈哈,到此本篇博客也就结束了,同时也希望看到这篇博客的朋友们能一起学习交流,如有错误,请多指正!!!

上一篇:第七届蓝桥杯试题c/c++A组方格填数 回溯法


下一篇:java算法 蓝桥杯(题+答案) 方格填数