第八届蓝桥杯(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) ;
        
    



  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第八届蓝桥杯C/C++ B组省赛个人代码

《蓝桥杯真题》:2017年单片机省赛(第八届)(内附两种代码实现风格)

蓝桥杯赛前冲刺-枚举暴力和排序专题2(包含历年蓝桥杯真题和AC代码)

第七届蓝桥杯(2016年)JavaB组省赛真题解析

第九届蓝桥杯JavaA组(2018年)省赛真题解析