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

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

d1132289ebacabfc951324cf59a0a4dd.png

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> map = null;

private static List 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 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;

}

}

}

}

运行结果:

bfed0feb7ec73ea7628a610fd82f01d2.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值