# 第六届蓝桥杯java B组国赛题目

#### 第六届蓝桥杯java B组国赛题目

1.标题：分机号
X老板脾气古怪，他们公司的电话分机号都是3位数，老板规定，所有号码必须是降序排列，且不能有重复的数位。比如：
751,520,321 都满足要求，而，
766,918,201 就不符合要求。

public class Main {
static int a[] = {0,1,2,3,4,5,6,7,8,9};
static int ans = 0;
public static void main(String[] args) {

dfs(0);
System.out.println(ans);
}
static void dfs(int offset) {
if(offset == 3) {
if(a[0] > a[1] && a[1] > a[2]) {
ans++;
}
//System.out.println(a[0] + " " +  a[1] + " " + a[2]);
return;
}
for(int i = offset; i <= 9; i++) {
swap(i, offset);
dfs(offset + 1);
swap(i, offset);
}
}

static void swap(int aa, int b) {
int temp = a[aa];
a[aa] = a[b];
a[b] = temp;
}
}

2.标题：五星填数

public class Main {
static int a[] = {1,2,3,4,5,6,8,9,10,12};
static int ans = 0;
public static void main(String[] args) {

dfs(0);
System.out.println(ans/10);
}
static void dfs(int offset) {
if(offset == 10) {
if(test()) {
ans++;
}
return;
}
for(int i = offset; i <= 9; i++) {
swap(i, offset);
dfs(offset + 1);
swap(i, offset);
}
}

static boolean test() {
boolean check = false;
int sum = a[0] + a[2] + a[5] + a[8];
if(a[1] + a[2] + a[3] + a[4] != sum) {
check = true;
}
if(a[0] + a[3] + a[6] + a[9] != sum) {
check = true;
}
if(a[1] + a[5] + a[7] + a[9] != sum) {
check = true;
}
if(a[4] + a[6] + a[7] + a[8] != sum) {
check = true;
}
return !check;
}
static void swap(int aa, int b) {
int temp = a[aa];
a[aa] = a[b];
a[b] = temp;
}
}

3.标题：显示二叉树

class BiTree
{
private int v;
private BiTree l;
private BiTree r;

public BiTree(int v){
this.v = v;
}

if(the.v < v){
if(l==null) l = the;
}
else{
if(r==null) r = the;
}
}

public int getHeight(){
int h = 2;
int hl = l==null? 0 : l.getHeight();
int hr = r==null? 0 : r.getHeight();
return h + Math.max(hl,hr);
}

public int getWidth(){
int w = (""+v).length();
if(l!=null) w += l.getWidth();
if(r!=null) w += r.getWidth();
return w;
}

public void show(){
char[][] buf = new char[getHeight()][getWidth()];
printInBuf(buf, 0, 0);
showBuf(buf);
}

private void showBuf(char[][] x){
for(int i=0; i<x.length; i++){
for(int j=0; j<x[i].length; j++)
System.out.print(x[i][j]==0? ' ':x[i][j]);
System.out.println();
}
}

private void printInBuf(char[][] buf, int x, int y){
String sv = "" + v;

int p1 = l==null? x : l.getRootPos(x);
int p2 = getRootPos(x);
int p3 = r==null? p2 : r.getRootPos(p2+sv.length());

buf[y][p2] = '|';
for(int i=p1; i<=p3; i++) buf[y+1][i]='-';
for(int i=0; i<sv.length(); i++) ________________________________;  //填空位置
if(p1<p2) buf[y+1][p1] = '/';
if(p3>p2) buf[y+1][p3] = '\\';

if(l!=null) l.printInBuf(buf,x,y+2);
if(r!=null) r.printInBuf(buf,p2+sv.length(),y+2);
}

private int getRootPos(int x){
return l==null? x : x + l.getWidth();
}
}

public class Main
{
public static void main(String[] args)
{
BiTree tree = new BiTree(500);
tree.show();
}
}

|
/--------------500---\
|                    |
/--200---\           /--509---\
|        |           |        |
100   /--250---\     507   /--600\
|        |           |     |
220   /--450         510   650
|
440

（如有对齐问题，请参考【图1.png】）

4.标题：穿越雷区
X星的坦克战车很奇怪，它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转，否则将报废。

A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -

A，B都只出现一次。

5
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -

10

CPU消耗  < 2000ms

import java.util.Scanner;

public class Main{
public static int xA,yA,xB,yB; //记录A和B的坐标
public static char[][] map;
public static int[][] book;
public static int n;
private static int stepMin = Integer.MAX_VALUE;
private static int[][] next = {{-1,0},{1,0},{0,1},{0,-1}};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
map = new char[n][n];
book = new int[n][n];
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
char temp = sc.next().charAt(0);
if(temp == '+' || temp == '-') {
map[i][j] = temp;
}else if(temp == 'A') {
xA = i;
yA = j;
map[i][j] = 'A';
}else if(temp == 'B') {
xB = i;
yB = j;
map[i][j] = 'B';
}
}
}
book[xA][yA] = 1;
dfs(xA,yA,'0', 0);
System.out.println(stepMin);
}
public static void dfs(int x, int y, char ch, int step) {
if(x == xB && y == yB) {
if(stepMin > step) {
stepMin = step;
}
return ;
}
int tx, ty;
for(int i = 0; i < 4; i++) {
tx  = x + next[i][0];
ty = y + next[i][1];
if(tx < 0 || ty < 0 || tx >= n || ty >= n) {
continue;
}
if(map[tx][ty] != ch && book[tx][ty] == 0 ){
book[tx][ty] = 1;
dfs(tx, ty, map[tx][ty], step + 1);
book[tx][ty] = 0;
}
}
}
}

5.标题：表格计算

1. SUM(x1,y1:x2,y2) 表示求左上角是第 x1 行第 y1 个格子，右下角是第 x2 行第 y2 个格子这个矩形内所有格子的值的和。
2. AVG(x1,y1:x2,y2) 表示求左上角是第 x1 行第 y1 个格子，右下角是第 x2 行第 y2 个格子这个矩形内所有格子的值的平均数。
3. STD(x1,y1:x2,y2) 表示求左上角是第 x1 行第 y1 个格子，右下角是第 x2 行第 y2 个格子这个矩形内所有格子的值的标准差。

「输入格式」

「输出格式」

「样例输入」
3 2
1 SUM(2,1:3,1)
2 AVG(1,1:1,2)
SUM(1,1:2,1) STD(1,1:2,2)
「样例输出」
1.00 5.00
2.00 3.00
3.00 1.48
「数据范围」

CPU消耗  < 2000ms

import java.util.Map;
import java.util.Scanner;

//数据不大，每次循环遍历数组处理数据，直到数据的数据都为数字为止。
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
scanner.nextLine();
String [][]s = new String[n][m];
for(int i = 0; i < n; i++) {
String string = scanner.nextLine();
s[i] = string.split(" ");
}
do{
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {

if(s[i][j].indexOf("SUM") != -1){
String str[] = s[i][j].split("\$$|,|:|,|\$$");
int x1 = Integer.valueOf(str[1]);
int y1 = Integer.valueOf(str[2]);
int x2 = Integer.valueOf(str[3]);
int y2 = Integer.valueOf(str[4]);
//System.out.println(x1 +" " + y1 + " " + x2 + " " + y2);
float sum = 0;
for(; x1 <= x2; x1++) {
for(int y = y1;y <= y2; y++) {
if(s[x1-1][y-1].indexOf("SUM") != -1||
s[x1-1][y-1].indexOf("AVG") != -1||
s[x1-1][y-1].indexOf("STD") != -1){

x1 = x2+1;
break;
}else {
sum += Float.valueOf(s[x1-1][y-1]);
}
}
}

if(x1 != x2 + 2){
s[i][j] = sum + "";
}

}else if(s[i][j].indexOf("AVG") != -1) {
String str[] = s[i][j].split("\$$|,|:|,|\$$");
int x1 = Integer.valueOf(str[1]);
int y1 = Integer.valueOf(str[2]);
int x2 = Integer.valueOf(str[3]);
int y2 = Integer.valueOf(str[4]);
float sum = 0;
int num = (x2-x1+1) * (y2-y1+1);
for(; x1 <= x2; x1++) {
for(int y = y1;y <= y2; y++) {
if(s[x1-1][y-1].indexOf("SUM") != -1||
s[x1-1][y-1].indexOf("AVG") != -1||
s[x1-1][y-1].indexOf("STD") != -1){
x1 = x2+1;
break;
}else {
sum += Float.valueOf(s[x1-1][y-1]);
}
}
}
if(x1 != x2 + 2){
s[i][j] = sum/num + "";
}
}else if(s[i][j].indexOf("STD") != -1) {
String str[] = s[i][j].split("\$$|,|:|,|\$$");
int x1 = Integer.valueOf(str[1]);
int y1 = Integer.valueOf(str[2]);
int x2 = Integer.valueOf(str[3]);
int y2 = Integer.valueOf(str[4]);
float sum = 0;
int num = (x2-x1+1) * (y2-y1+1);
for(; x1 <= x2; x1++) {
for(int y= y1;y <= y2; y++) {
if(s[x1-1][y-1].indexOf("SUM") != -1||
s[x1-1][y-1].indexOf("AVG") != -1||
s[x1-1][y-1].indexOf("STD") != -1){
x1 = x2+1;
break;
}else {
sum += Float.valueOf(s[x1-1][y-1]);
}
}
}
float avg = sum/num;
if(x1 != x2 + 2){
sum = 0;
x1 = Integer.valueOf(str[1]);

for(;x1 <= x2; x1++){
for(int y = y1;y <= y2; y++){
Float tempFloat = (Float.valueOf(s[x1-1][y-1]) - avg)* (Float.valueOf(s[x1-1][y-1]) - avg);
sum += tempFloat;
}
}
avg = sum/num;
avg = (float)Math.sqrt(avg);
s[i][j] = avg + "";
}
}
}
}

for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
System.out.print(String.format("%.2f", Float.valueOf(s[i][j])));
if(j != m-1) {
System.out.print(" ");
}else {
System.out.println();
}
}
}
}
}

6.标题：铺瓷砖

【输入格式】

【输出格式】

【样例输入1】
4 4
【样例输出1】
2
【样例说明1】

【样例输入2】
2 6
【样例输出2】
4
【数据规模与约定】

资源约定：

CPU消耗  < 8000ms

• 广告
• 抄袭
• 版权
• 政治
• 色情
• 无意义
• 其他

120