第七届蓝桥杯(2016年)JavaB组省赛真题解析
Posted nuist__NJUPT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第七届蓝桥杯(2016年)JavaB组省赛真题解析相关的知识,希望对你有一定的参考价值。
第七届蓝桥杯(2016年)JavaB组省赛真题解析
- 1.煤球数量
- 有一堆煤球,堆成三角棱锥形
- 第一层1个
- 第二层3个
- 第三层6个
- 第四层10个
- …
- 如果有100层,一共有多少个煤球?
/**
* 1.煤球数量
* 有一堆煤球,堆成三角棱锥形
* 第一层1个
* 第二层3个
* 第三层6个
* 第四层10个
* ...
* 如果有100层,一共有多少个煤球?
*/
public class Main
public static void main(String[] args)
int level = 0, sum = 0 ;
for(int i=1; i<=100; i++)
level += i ;
sum += level ;
System.out.println(sum);
2.生日蜡烛
public class Main
public static void main(String[] args)
for(int i=1;i<100; i++)
int sum = 0 ;
for(int j=i;j<100; j++)
sum += j;
if(sum == 236)
System.out.println(i);
break ;
else if(sum > 236)
continue;
3.凑算式
public class Main
static int cnt = 0 ;
static int [] arr = new int [] 1,2,3,4,5,6,7,8,9 ;
public static void main(String[] args)
f(arr, 0) ;
System.out.println(cnt);
private static void f(int[] arr, int k)
if(k == arr.length)
if(check())
cnt ++ ;
for(int j=k; j<arr.length; j++)
swap(arr, j, k) ;
f(arr, k+1) ;
swap(arr, j, k) ;
private static boolean check()
int A = arr[0] ;
int B = arr[1] ;
int C = arr[2] ;
int DEF = arr[3]*100+arr[4]*10+arr[5] ;
int GHI = arr[6]*100+arr[7]*10+arr[8] ;
if(A + 1.0*B/C + 1.0*DEF/GHI == 10)
return true ;
return false ;
private static void swap(int []arr, int j, int k)
int temp = arr[j] ;
arr[j] = arr[k] ;
arr[k] = temp ;
4,5填空题略
6.方格填数
public class Main
static int cnt = 0 ;
static int [] arr = new int [] 0,1,2,3,4,5,6,7,8,9 ;
public static void main(String[] args)
f(arr, 0) ;
System.out.println(cnt);
private static void f(int[] arr, int k)
if(k == arr.length)
if(check())
cnt ++ ;
for(int j=k; j<arr.length; j++)
swap(arr, j, k) ;
f(arr, k+1) ;
swap(arr, j, k) ;
private static boolean check()
if(Math.abs(arr[0]-arr[1])==1 || Math.abs(arr[1]-arr[2])==1)
return false ;
if(Math.abs(arr[3]-arr[4])==1 || Math.abs(arr[4]-arr[5])==1 || Math.abs(arr[5]-arr[6])==1)
return false ;
if(Math.abs(arr[7]-arr[8])==1 || Math.abs(arr[8]-arr[9])==1)
return false ;
if(Math.abs(arr[0]-arr[4])==1 || Math.abs(arr[1]-arr[5])==1 || Math.abs(arr[2]-arr[6])==1)
return false ;
if(Math.abs(arr[3]-arr[7])==1 || Math.abs(arr[4]-arr[8])==1 || Math.abs(arr[5]-arr[9])==1)
return false ;
if(Math.abs(arr[0]-arr[3])==1 || Math.abs(arr[1]-arr[4])==1 || Math.abs(arr[5]-arr[2])==1)
return false ;
if(Math.abs(arr[4]-arr[7])==1 || Math.abs(arr[5]-arr[8])==1 || Math.abs(arr[6]-arr[9])==1)
return false ;
if(Math.abs(arr[0]-arr[5])==1 || Math.abs(arr[1]-arr[6])==1)
return false ;
if(Math.abs(arr[3]-arr[8])==1 || Math.abs(arr[4]-arr[9])==1)
return false ;
return true ;
private static void swap(int []arr, int j, int k)
int temp = arr[j] ;
arr[j] = arr[k] ;
arr[k] = temp ;
7.剪邮票
方法1:先全排列,再去重,再搜索判断是否联通,
最后统计联通的个数就是我们的答案。
/**
* 先全排列,再去重,在搜索判断是否联通
* 最后统计联通的个数就是我们的答案,
* 这个时间复杂度过高,运行时间较长
*/
import java.util.Set;
import java.util.TreeSet;
public class Main
static int cnt = 0 ;
static int [] arr = new int [] 0,0,0,0,0,0,0,1,1,1,1,1 ;
static int [][] res ;
static Set<String> set = new TreeSet<>() ;
public static void main(String[] args)
f(arr, 0) ;
System.out.println(cnt);
private static void f(int[] arr, int k)
if(k == arr.length)
if(check() && check1())
cnt++;
for(int j=k; j<arr.length; j++)
swap(arr, j, k) ;
f(arr, k+1) ;
swap(arr, j, k) ;
private static boolean check1()
int size = set.size() ;
String s = "" ;
for(int i=0; i<arr.length; i++)
s += arr[i] ;
set.add(s) ;
if(set.size() > size)
return true ;
else
return false ;
private static boolean check()
res = new int [3][4] ;
for(int i=0; i<3; i++)
for(int j=0; j<4; j++)
res[i][j] = arr[i*4+j] ;
int num = 0 ;
for(int i=0; i<3; i++)
for(int j=0; j<4; j++)
if(res[i][j] == 1)
dfs( i, j) ;
num ++ ;
return num==1 ;
private static void dfs(int x, int y)
res[x][y] = 0;
if(x-1>=0 && res[x-1][y]==1)
dfs(x-1, y) ;
if(x+1<=2 && res[x+1][y]==1)
dfs( x+1, y) ;
if(y-1>=0 && res[x][y-1]==1)
dfs( x, y-1) ;
if(y+1<=3 && res[x][y+1]==1)
dfs( x , y+1) ;
private static void swap(int []arr, int j, int k)
int temp = arr[j] ;
arr[j] = arr[k] ;
arr[k] = temp ;
方法2:抓取法提前去重,再搜索判断是否联通
public class Main1
static int [] a = 0,0,0,0,0,0,0,1,1,1,1,1 ;
static int cnt = 0 ;
static boolean [] vis = new boolean[12] ;
static int [] path = new int [12] ;
public static void main(String[] args)
full(0) ;
System.out.println(cnt);
private static void full(int k)
if(k == path.length)
if(checks()) 以上是关于第七届蓝桥杯(2016年)JavaB组省赛真题解析的主要内容,如果未能解决你的问题,请参考以下文章
2020第十一届蓝桥杯真题JAVA B组省赛第二场答案分享(2020.10.17)