第七届蓝桥杯JavaB组——第6题方格填数
解决方案:利用全排列和递归
package com.lzp.lanqiaoseven.p6;
import java.util.*;
/**
* @Author LZP
* @Date 2021/2/26 14:38
* @Version 1.0
*
*
方格填数
如下的10个格子
+--+--+--+
| | | |
+--+--+--+--+
| | | | |
+--+--+--+--+
| | | |
+--+--+--+
(如果显示有问题,也可以参看【图1.jpg】)
填入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> set = null;
public static void main(String[] args) {
map = new HashMap<>();
set = new ArrayList<>();
set.add(2);
set.add(4);
set.add(5);
set.add(6);
map.put(1, set);
set = new ArrayList<>();
set.add(1);
set.add(3);
set.add(5);
set.add(6);
set.add(7);
map.put(2, set);
set = new ArrayList<>();
set.add(2);
set.add(6);
set.add(7);
map.put(3, set);
set = new ArrayList<>();
set.add(1);
set.add(5);
set.add(8);
set.add(9);
map.put(4, set);
set = new ArrayList<>();
set.add(1);
set.add(2);
set.add(4);
set.add(6);
set.add(8);
set.add(9);
set.add(10);
map.put(5, set);
set = new ArrayList<>();
set.add(1);
set.add(2);
set.add(3);
set.add(5);
set.add(7);
set.add(9);
set.add(10);
map.put(6, set);
set = new ArrayList<>();
set.add(2);
set.add(3);
set.add(6);
set.add(10);
map.put(7, set);
set = new ArrayList<>();
set.add(4);
set.add(5);
set.add(9);
map.put(8, set);
set = new ArrayList<>();
set.add(4);
set.add(5);
set.add(6);
set.add(8);
set.add(10);
map.put(9, set);
set = new ArrayList<>();
set.add(5);
set.add(6);
set.add(7);
set.add(9);
map.put(10, set);
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;
}
}
}
}
运行结果:
感悟:一开始总以为各个方格可以填写重复了数,然后用代码实现的时候发现结果好长时间都没运行出来,这时就反过来思考,这毕竟是一个结果填空题,题目应该不至于那么复杂,然后就再试了一下将0~9这10个数字依次不重复的填入所有方格,也就是每个方格的数都不能相同(即每个数只能用一次),最后程序竟然跑出结果来了。于是就去网上看下网友的答案,发现我俩的答案是一样的,我觉得没那么巧,答案应该是没有错,我还是不放心,就再搜了几篇博客再验证一下。终于功夫不负有心人,都对上了哈哈,到此本篇博客也就结束了,同时也希望看到这篇博客的朋友们能一起学习交流,并多多指正小弟!!!