题目:
如下的10个格子
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
思路:
第一开始想的是用二维数组,后来觉得太麻烦,直接用一维数组去判断
不用想太复杂,把每个格子减一边值的绝对值不为1即可
例如:
0-1 , 0-3 , 0-4 , 0-5;
1-2 ,1-4 ,1-5 ,1-6;
2-5 ,2-6,;
3-4 ,3-7 ,3-8;
4-5 ,4-7 , 4-8 ,4-9;
5-6, 5-8 , 5-9;
7-8 ;
8-9;
不需要在用1-0,...的重复判断,绝对值不为1即可
利用全排列对数值进行排列筛选放入Set集合去重
最后输出Set集合长度
答案:
1580
代码:
在网站上看有点乱,可以复制到编译器中查看
package com.cxyax.review;
import java.util.Set;
import java.util.TreeSet;
public class Main3 {
static int[] nums = {0,1,2,3,4,5,6,7,8,9};
static Set<String> set = new TreeSet<String>();
public static void f(int x){
String str = "";
//每个格子都减一次,绝对值不为1,就不用判断-1,减过得格子不用进行二次判断
if(Math.abs(nums[0] - nums[1]) != 1 && Math.abs(nums[0] - nums[3]) != 1 && Math.abs(nums[0] - nums[4]) != 1 && Math.abs(nums[0] - nums[5]) != 1 &&
Math.abs(nums[1] - nums[2]) != 1 && Math.abs(nums[1] - nums[5]) != 1 && Math.abs(nums[1] - nums[6]) != 1 && Math.abs(nums[1] - nums[4]) != 1 &&
Math.abs(nums[2] - nums[5]) != 1 && Math.abs(nums[2] - nums[6]) != 1 &&
Math.abs(nums[3] - nums[4]) != 1 && Math.abs(nums[3] - nums[7]) != 1 && Math.abs(nums[3] - nums[8]) != 1 &&
Math.abs(nums[4] - nums[5]) != 1 && Math.abs(nums[4] - nums[7]) != 1 && Math.abs(nums[4] - nums[8]) != 1 && Math.abs(nums[4] - nums[9]) != 1 &&
Math.abs(nums[5] - nums[6]) != 1 && Math.abs(nums[5] - nums[8]) != 1 && Math.abs(nums[5] - nums[9]) != 1 &&
Math.abs(nums[6] - nums[9]) != 1 &&
Math.abs(nums[7] - nums[8]) != 1 &&
Math.abs(nums[8] - nums[9]) != 1){
for(int i = 0; i < nums.length;i++){
str += nums[i]+"";
}
set.add(str);
}
//全排列
for(int i = x; i < nums.length;i++){
int y = nums[x];
nums[x] = nums[i];
nums[i] = y;
f(x+1);
y = nums[x];
nums[x] = nums[i];
nums[i] = y;
}
}
public static void main(String[] args) {
f(0);
System.out.println(set.size());
}
}
以上是《JAVA 蓝桥杯 第七届B组 第六题 方格填数 带思路》的全部内容,
感谢您对程序员阿鑫博客的支持!
版权说明
文章采用: 《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权。版权声明:未标注转载均为本站原创,转载时请以链接形式注明文章出处。如有侵权、不妥之处,请联系站长删除。敬请谅解!