第八届蓝桥杯(2017年)JavaA组省赛真题解析
Posted nuist__NJUPT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第八届蓝桥杯(2017年)JavaA组省赛真题解析相关的知识,希望对你有一定的参考价值。
第八届蓝桥杯(2017年)JavaA组省赛真题解析
- 1.迷宫
- X星球的一处迷宫游乐园建在某个小山坡上,
- 它是由10*10相互联通的小房间组成,房间的地板上写着很大的字母,
- 我们假设玩家是面超着上坡的方向战立,则
- L表示走到左边的房间
- R表示走到右边的额房间
- U表示走向上坡方向的房间
- D表示走到下坡方向的房间
- 100位玩家,你算一下最后又有多少个能走出迷宫?
方式1:搜索+标记
public class Main
static int cnt = 0 ;
static int [][] vis = new int [10][10] ;
public static void main(String[] args)
char[][] a =
'U','D','D','L','U','U','L','R','U','L',
'U','U','R','L','L','L','R','R','R','U',
'R','R','U','U','R','L','D','L','R','D',
'R','U','D','D','D','D','U','U','U','U',
'U','R','U','D','L','L','R','R','U','U',
'D','U','R','L','R','L','D','L','R','L',
'U','L','L','U','R','L','L','R','D','U',
'R','D','L','U','L','L','R','D','D','D',
'U','U','D','D','U','D','U','D','L','L',
'U','L','R','D','L','U','U','R','R','R',
;
for(int i=0; i<10; i++)
for(int j=0; j<10; j++)
boolean res = dfs(a, i, j) ;
if(res)
cnt ++ ;
clear(vis) ;
System.out.println(cnt);
private static void clear(int[][] vis)
for(int i=0; i<vis.length; i++)
for(int j=0; j<vis[0].length; j++)
vis[i][j] = 0 ;
private static boolean dfs(char[][] a, int i, int j)
if(i<0 || j<0 || i>9 || j>9)
return true ;
if(vis[i][j] == 1)
return false ;
vis[i][j] = 1 ;
switch (a[i][j])
case 'U': return dfs(a, i-1, j) ;
case 'D': return dfs(a, i+1, j) ;
case 'L': return dfs(a, i, j-1) ;
case 'R': return dfs(a, i, j+1) ;
default: return false ;
方式2:
/**
* 1.迷宫
* X星球的一处迷宫游乐园建在某个小山坡上,
* 它是由10*10相互联通的小房间组成,房间的地板上写着很大的字母,
* 我们假设玩家是面超着上坡的方向战立,则
* L表示走到左边的房间
* R表示走到右边的额房间
* U表示走向上坡方向的房间
* D表示走到下坡方向的房间
* 100位玩家,你算一下最后又有多少个能走出迷宫?
*/
public class Main1
static int cnt = 0 ;
static int [][] vis = new int [10][10] ;
public static void main(String[] args)
char[][] a =
'U','D','D','L','U','U','L','R','U','L',
'U','U','R','L','L','L','R','R','R','U',
'R','R','U','U','R','L','D','L','R','D',
'R','U','D','D','D','D','U','U','U','U',
'U','R','U','D','L','L','R','R','U','U',
'D','U','R','L','R','L','D','L','R','L',
'U','L','L','U','R','L','L','R','D','U',
'R','D','L','U','L','L','R','D','D','D',
'U','U','D','D','U','D','U','D','L','L',
'U','L','R','D','L','U','U','R','R','R',
;
for(int i=0; i<10; i++)
for(int j=0; j<10; j++)
dfs(a, i, j) ;
System.out.println(cnt);
private static void clear(int[][] vis)
for(int i=0; i<vis.length; i++)
for(int j=0; j<vis[0].length; j++)
vis[i][j] = 0 ;
private static void dfs(char[][] a, int i, int j)
if(i<0 || j<0 || i>9 || j>9)
cnt ++ ;
clear(vis);
return ;
if(vis[i][j] == 1)
clear(vis);
return ;
vis[i][j] = 1 ;
if(a[i][j] == 'U')
dfs(a, i-1, j) ;
if(a[i][j] == 'D')
dfs(a, i+1, j) ;
if(a[i][j] == 'L')
dfs(a, i, j-1) ;
if(a[i][j] == 'R')
dfs(a, i, j+1) ;
- 9数算式
全排列划分区间计算
/**
* 9数算式
*/
import java.util.Arrays;
public class Main
//最后要除2
static int [] a ;
static int cnt = 0 ;
public static void main(String[] args)
a = new int[] 1,2,3,4,5,6,7,8,9 ;
f(a, 0) ;
System.out.println(cnt/2);
private static void f(int[] a, int k) //全排列
if(k==a.length)
check(a) ;
for(int j=k; j<a.length; j++)
swap(a, j, k) ;
f(a, k+1) ;
swap(a, j, k) ;
private static void swap(int [] a, int i, int j)
int temp = a[i] ;
a[i] = a[j] ;
a[j] = temp ;
private static void check(int [] a) //第每个排列判断,并计数
for(int j=1; j<a.length; j++)
int pre = compute(a, 0, j) ;
int pos = compute(a, j, a.length) ;
int value = pre * pos ;
if(judge(value))
cnt ++ ;
private static int compute(int[] a, int x, int y)
int sum = 0 ;
for(int i=x; i<y; i++)
sum = sum * 10 + a[i] ;
return sum ;
private static boolean judge(int value)
String s = String.valueOf(value);
char [] r = s.toCharArray() ;
Arrays.sort(r);
String s1 = String.valueOf(r) ;
return s1.equals("123456789") ;
3.魔方状态
略
- 4.方格分割
- 6*6的方格,沿着格子的边线剪成两部分,要求这两部分完全相同,
- 一共有多少种分割方法,旋转对称的属于同一种方法。
/**
* 4.方格分割
* 6*6的方格,沿着格子的边线剪成两部分,要求这两部分完全相同,
* 一共有多少种分割方法,旋转对称的属于同一种方法。
*
*/
public class Main
static int cnt = 0 ;
static int [] offsetX = -1,1,0,0 ;
static int [] offsetY = 0,0,-1,1 ;
static int [][] vis = new int [7][7] ;
public static void main(String[] args)
dfs(3, 3) ;
System.out.println(cnt/4);
private static void dfs(int x, int y)
if(x==0 || y==0 || x==6 || y==6)
cnt ++ ;
return ;
vis[x][y] = 1 ;
vis[6-x][6-y] = 1 ;
for(int i=0; i<4; i++)
int nx = offsetX[i] + x ;
int ny = offsetY[i] + y ;
if(nx<0 || ny<0 || nx>6 || ny>6)
continue;
if(vis[nx][ny] != 1)
dfs(nx, ny);
vis[x][y] = 0 以上是关于第八届蓝桥杯(2017年)JavaA组省赛真题解析的主要内容,如果未能解决你的问题,请参考以下文章
蓝桥日记①2017第八届省赛(软件类)JavaA组❤️答案解析
《蓝桥杯真题》:2017年单片机省赛(第八届)(内附两种代码实现风格)