1愤怒小鸟
X星球愤怒的小鸟喜欢撞火车!
一根平直的铁轨上两火车间相距 1000 米
两火车 (不妨称A和B) 以时速 10米/秒 相对行驶。
愤怒的小鸟从A车出发,时速50米/秒,撞向B车,
然后返回去撞A车,再返回去撞B车,如此往复....
两火车在相距1米处停车。
问:这期间愤怒的小鸟撞 B 车多少次?
注意:需要提交的是一个整数(表示撞B车的次数),不要填写任何其它内容。
答案:9次
public class Main {
public static void main(String[] args) {
int sum=0;
double juli=1000;
System.out.println(sum+" 距离 "+juli);
for(int time=0;juli>1.0;time++) {//time改成ms
if((0.06*time)>juli) {
sum++;
juli=(double) (juli-(0.02*time));
System.out.println(sum+" 距离 "+juli+" 时间 "+time);
time=0;
}
}
}
}
运行结果:
0 距离 1000.0
1 距离 666.66 时间 16667
2 距离 444.41999999999996 时间 11112
3 距离 296.26 时间 7408
4 距离 197.5 时间 4938
5 距离 131.66 时间 3292
6 距离 87.75999999999999 时间 2195
7 距离 58.499999999999986 时间 1463
8 距离 38.999999999999986 时间 975
9 距离 25.999999999999986 时间 650
10 距离 17.319999999999986 时间 434
11 距离 11.539999999999985 时间 289
12 距离 7.6799999999999855 时间 193
13 距离 5.119999999999985 时间 128
14 距离 3.3999999999999853 时间 86
15 距离 2.259999999999985 时间 57
16 距离 1.4999999999999851 时间 38
17 距离 0.9999999999999851 时间 25
当碰撞为奇数时,代表撞向b所以一共撞击了9次
关于第九次碰撞距离小于1的情况
由于二进制无法表示0.1 所有double本身有误差
即0.9999999999可以看作是1;即刚好装上
2反幻方
我国古籍很早就记载着
2 9 4
7 5 3
6 1 8
这是一个三阶幻方。每行每列以及对角线上的数字相加都相等。
下面考虑一个相反的问题。
可不可以用 1~9 的数字填入九宫格。
使得:每行每列每个对角线上的数字和都互不相等呢?
这应该能做到。
比如:
9 1 2
8 4 3
7 5 6
你的任务是搜索所有的三阶反幻方。并统计出一共有多少种。
旋转或镜像算同一种。
比如:
9 1 2
8 4 3
7 5 6
7 8 9
5 4 1
6 3 2
2 1 9
3 4 8
6 5 7
等都算作同一种情况。
请提交三阶反幻方一共多少种。这是一个整数,不要填写任何多余内容。
import java.util.ArrayList;
import java.util.HashSet;
public class Main {
static int aa[]= {1,2,3,4,5,6,7,8,9};
static int bb[]=new int[aa.length];
static int sum=0;
public static void main(String[] args) {
pailie(0);
}
public static void pailie(int dibiao) {
if(dibiao==aa.length) {
if(panduan(bb)==true) {
shuchu();
sum++;
System.out.println(sum);
}
return;
}
else {
for(int i=0;i
int p=aa[i];
if(cishu(bb,p)
bb[dibiao]=p;
pailie(dibiao+1);
bb[dibiao]=0;
}
}
}
}
public static boolean panduan(int cc[]) {
int h1=cc[0]+cc[1]+cc[2];
int h2=cc[3]+cc[4]+cc[5];
int h3=cc[6]+cc[7]+cc[8];
int l1=cc[0]+cc[3]+cc[6];
int l2=cc[1]+cc[4]+cc[7];
int l3=cc[2]+cc[5]+cc[8];
int x1=cc[0]+cc[4]+cc[8];
int x2=cc[2]+cc[4]+cc[6];
HashSet arr=new HashSet();//hashset可以去重
arr.add(h1);
arr.add(h2);
arr.add(h3);
arr.add(l1);
arr.add(l2);
arr.add(l3);
arr.add(x1);
arr.add(x2);
if(arr.size()==8) {//arr中有8个不同元素,即两两不同
return true;
}
return false;
}
private static void shuchu() {
for(int i=0;i
System.out.print(bb[i]);
}
System.out.println();
}
public static int cishu(int ku[],int x) {//返回数组中x出现 的次数
int sum=0;
for(int z:ku) {
if(z==x) {
sum++;
}
}
return sum;
}
}
程序运行结果
24960
由于有四个方向,并且左右可以调换
24960/4/2=3120
3打靶
小明参加X星球的打靶比赛。
比赛使用电子感应计分系统。其中有一局,小明得了96分。
这局小明共打了6发子弹,没有脱靶。
但望远镜看过去,只有3个弹孔。
显然,有些子弹准确地穿过了前边的弹孔。
不同环数得分是这样设置的:
1,2,3,5,10,20,25,50
那么小明的6发子弹得分都是多少呢?有哪些可能情况呢?
下面的程序解决了这个问题。
仔细阅读分析代码,填写划线部分缺失的内容。
public class Main
{
static void f(int[] ta, int[] da, int k, int ho, int bu, int sc)
{
if(ho<0 || bu<0 || sc<0) return;
if(k==ta.length){
if(ho>0 || bu>0 || sc>0) return;
for(int i=0; i
for(int j=0; j
System.out.print(ta[i] + " ");
}
System.out.println();
return;
}
for(int i=0; i<=bu; i++){
da[k] = i;
f(ta, da, k+1, __________________ , bu-i, sc-ta[k]*i); // 填空位置
}
da[k] = 0;
}
public static void main(String[] args)
{
int[] ta = {1,2,3,5,10,20,25,50};
int[] da = new int[8];
f(ta, da, 0, 3, 6, 96);
}
}
答案:
da[k]==0?ho:ho-1
4路径之谜
小明冒充X星球的骑士,进入了一个奇怪的城堡。
城堡里边什么都没有,只有方形石头铺成的地面。
假设城堡地面是 n x n 个方格。【如图1.png】所示。
按习俗,骑士要从西北角走到东南角。
可以横向或纵向移动,但不能斜着走,也不能跳跃。
每走到一个新方格,就要向正北方和正西方各射一箭。
(城堡的西墙和北墙内各有 n 个靶子)
同一个方格只允许经过一次。但不必做完所有的方格。
如果只给出靶子上箭的数目,你能推断出骑士的行走路线吗?
有时是可以的,比如图1.png中的例子。
本题的要求就是已知箭靶数字,求骑士的行走路径(测试数据保证路径唯一)
输入:
第一行一个整数N(0
第二行N个整数,空格分开,表示北边的箭靶上的数字(自西向东)
第三行N个整数,空格分开,表示西边的箭靶上的数字(自北向南)
输出:
一行若干个整数,表示骑士路径。
为了方便表示,我们约定每个小格子用一个数字代表,从西北角开始编号: 0,1,2,3....
比如,图1.png中的方块编号为:
图1.png
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
示例:
用户输入:
4
2 4 3 4
4 3 3 3
程序应该输出:
0 4 5 1 2 3 7 11 10 9 13 14 15
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms[图片上传中...(图1.png-611f27-1558440945982-0)]
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。