答案:120
import java.util.*;
public class Main {
public static boolean check(int n)
{
int a1=n%10;
int a2=n/10%10;
int a3=n/100;
if(a1!=a2 && a2!=a3 && a3!=a1 && a3>a2 && a2>a1)
{
return true;
}
else
return false;
}
public static void main(String args[]) {
int count=0;
for(int i=100;i<=999;i++)
{
if(check(i))
{
count++;
}
}
System.out.println(count);
}
}
2.标题:五星填数
答案:12
思路:暴力全排,最后除 旋转*对称 = 5*2 = 10.
import java.util.*;
public class Main {
static int count=0;
public static boolean check(int a[])
{
int r[]=new int[5];
r[0]=a[0]+a[3]+a[6]+a[9];
r[1]=a[9]+a[7]+a[5]+a[1];
r[2]=a[1]+a[2]+a[3]+a[4];
r[3]=a[4]+a[6]+a[7]+a[8];
r[4]=a[8]+a[5]+a[2]+a[0];
for(int i=0;i<4;i++)
{
for(int j=i+1;j<5;j++)
{
if(r[i]!=r[j])
{
return false;
}
}
}
return true;
}
public static void allSort(int a[],int s,int e)
{
if(s==e)
{
System.out.println(Arrays.toString(a));
if(check(a))
{
count++;
}
return;
}
for(int i=s;i<=e;i++)
{
swap(a,s,i);
allSort(a,s+1,e);
swap(a,s,i);
}
}
public static void swap(int a[],int s,int e)
{
int temp=a[s];
a[s]=a[e];
a[e]=temp;
}
public static void main(String args[]) {
int array[]={1,2,3,4,5,6,8,9,10,12};
allSort(array,0,array.length-1);
System.out.println(count/10);
}
}
3.
标题:显示二叉树
排序二叉树的特征是:
某个节点的左子树的所有节点值都不大于本节点值。
某个节点的右子树的所有节点值都不小于本节点值。
为了能形象地观察二叉树的建立过程,小明写了一段程序来显示出二叉树的结构来。
答案:buf[y+1][p2+i] = sv.charAt(i)
4.
标题:穿越雷区
X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。
某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?
已知的地图是一个方阵,上面用字母标出了A,B区,其它区都标了正号或负号分别表示正负能量辐射区。
例如:
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -
坦克车只能水平或垂直方向上移动到相邻的区。
数据格式要求:
输入第一行是一个整数n,表示方阵的大小, 4<=n<100
接下来是n行,每行有n个数据,可能是A,B,+,-中的某一个,中间用空格分开。
A,B都只出现一次。
要求输出一个整数,表示坦克从A区到B区的最少移动步数。
如果没有方案,则输出-1
例如:
用户输入:
5
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -
则程序应该输出:
10
资源约定:
峰值内存消耗(含虚拟机) < 512M
CPU消耗 < 2000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
思路:简单DFS
注意:主类的名字必须是:Main,否则按无效代码处理。
import java.util.Scanner;
public class Main
{
static String[][] str = new String[50][50];
static double[][] d = new double[50][50];
static int n, m;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n = in.nextInt();
m = in.nextInt();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
String c = in.next();
str[i][j] = c;
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (str[i][j].charAt(0) < '0' || str[i][j].charAt(0) > '9') {
d[i][j] = func(str[i][j], i, j);
} else {
d[i][j] = Double.valueOf(str[i][j]);
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j < m; j++) {
System.out.printf("%.2f ",d[i][j]);
}
System.out.printf("%.2f\n", d[i][m]);
}
}
/**
* 这里必须采用函数的方式将这里包起来,因为有的sum处理里面还会包含sum,所以需要再次调用这里的函数。
* */
private static double func(String string, int i, int j) {
// TODO Auto-generated method stub
int subce[] = sub(str[i][j]);
if (str[i][j].substring(0, 3).equals("SUM")) {
return sum(subce);
} else if (str[i][j].substring(0, 3).equals("AVG")) {
return avg(subce);
} else if (str[i][j].substring(0, 3).equals("STD")) {
return std(subce);
} else {
return -1;
}
}
/**
* 三个表达式的计算都很简单
* 在求avg和std中,要有注意如何求四个坐标所围矩阵中单元格的个数,可以使用(x2-x1+1)*(y2-y1+1),也可以直接计数
* 由于每个计算都有可能出现类似sum的计算中包含sum的情况,所以要进行判断,再次调用func()
* */
private static double sum(int[] ce2) {
// TODO Auto-generated method stub
double cnt = 0.0;
for (int i = ce2[1]; i <= ce2[3]; i++) {
for (int j = ce2[2]; j <= ce2[4]; j++) {
if (str[i][j].charAt(0) < '0' || str[i][j].charAt(0) > '9') {
cnt += func(str[i][j], i, j);
} else {
cnt += Double.valueOf(str[i][j]);
}
}
}
return cnt;
}
private static double avg(int[] ce2) {
// TODO Auto-generated method stub
double cnt = 0.0;
int q = 0;
for (int i = ce2[1]; i <= ce2[3]; i++) {
for (int j = ce2[2]; j <= ce2[4]; j++) {
if (str[i][j].charAt(0) < '0' || str[i][j].charAt(0) > '9') {
cnt += func(str[i][j], i, j);
} else {
cnt += Double.valueOf(str[i][j]);
}
q++;
}
}
return cnt/q;
}
private static double std(int[] ce2) {
// TODO Auto-generated method stub
double cnt = 0.0;
int q = 0;
double x = avg(ce2);
for (int i = ce2[1]; i <= ce2[3]; i++) {
for (int j = ce2[2]; j <= ce2[4]; j++) {
if (str[i][j].charAt(0) < '0' || str[i][j].charAt(0) > '9') {
cnt += Math.pow(func(str[i][j], i, j) - x, 2);
} else {
cnt += Math.pow(Double.valueOf(str[i][j]) - x, 2);
}
q++;
}
}
return Math.sqrt(cnt/q);
}
/***
* 下面是对表达式进行截取拆分获取x1,x2,y1,y2的过程
* 由于出现了两次",",所以在获取的过程中要注意,第二个","的获取可以先将前一个","连同之前的内容截去,然后再进行一次截取
*
*/
private static int[] sub(String s) {
// TODO Auto-generated method stub
int[] ce = new int[5];
for (int i = 0; i < ce.length; i++) {
ce[i] = 0;
}
int befKuohao = s.indexOf('(');
int firstDouhao = s.indexOf(',');
int maohao = s.indexOf(':');
int secDouhao = s.substring((s.indexOf(',')+1)).indexOf(',') + (s.indexOf(',')+1);
int aftKuohao = s.indexOf(')');
ce[1] = Integer.valueOf(s.substring(befKuohao+1, firstDouhao));
ce[2] = Integer.valueOf(s.substring(firstDouhao+1, maohao));
ce[3] = Integer.valueOf(s.substring(maohao+1, secDouhao));
ce[4] = Integer.valueOf(s.substring(secDouhao+1, aftKuohao));
return ce;
}
}
6.
标题:铺瓷砖
为了让蓝桥杯竞赛更顺利的进行,主办方决定给竞赛的机房重新铺放瓷砖。机房可以看成一个n*m的矩形,而这次使用的瓷砖比较特别,有两种形状,如【图1.png】所示。在铺放瓷砖时,可以旋转。
主办方想知道,如果使用这两种瓷砖把机房铺满,有多少种方案。
【输入格式】
输入的第一行包含两个整数,分别表示机房两个方向的长度。
【输出格式】
输出一个整数,表示可行的方案数。这个数可能很大,请输出这个数除以65521的余数。
【样例输入1】
4 4
【样例输出1】
2
【样例说明1】
这两种方案如下【图2.png】所示:
【样例输入2】
2 6
【样例输出2】
4
【数据规模与约定】
对于20%的数据,1<=n, m<=5。
对于50%的数据,1<=n<=100,1<=m<=5。
对于100%的数据,1<=n<=10^15,1<=m<=6。
资源约定:
峰值内存消耗(含虚拟机) < 512M
CPU消耗 < 8000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
思路:应该是先拆分砖块数,如12=3*4=4*3,再分别考察每种情况是否可行,但是题目貌似把旋转对称的方案也算作不同,先占坑。