网易——小易的升级之路、炮台的攻击、扫描透镜

本文通过三个游戏编程题目,探讨了如何使用Java解决游戏场景中的实际问题,包括角色升级、炮台攻击范围判断及清理隐形障碍物等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分析:题目都很简单,笔试中编程题值得注意的点:

1.类名为public classMain{}

2.因main方法为static的,所以所有的接口函数都要设为static

3.就是对数据的输入,严格按照题目要求的输入规则来

本题采用了Scanner进行测试数据的输入,注意Scanner对各种不同类型数据的输入和返回boolean的hasNext(),hasNextInt()方法。


题目一:小易的升级之路

小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段时间内,他将会依次遇见n个怪物,每个怪物的防御力为b1,b2,b3...bn. 如果遇到的怪物防御力bi小于等于小易的当前能力值c,那么他就能轻松打败怪物,并 且使得自己的能力值增加bi;如果bi大于c,那他也能打败怪物,但他的能力值只能增加bi 与c的最大公约数.那么问题来了,在一系列的锻炼后,小易的最终能力值为多少?

输入描述:
对于每组数据,第一行是两个整数n(1≤n<100000)表示怪物的数量和a表示小易的初始能力值.
第二行n个整数,b1,b2...bn(1≤bi≤n)表示每个怪物的防御力
输出描述:
对于每组数据,输出一行.每行仅包含一个整数,表示小易的最终能力值
输入例子:
3 50
50 105 200
5 20
30 20 15 40 100
输出例子:
110
205

import java.util.*;
public class Main{
    public static void main(String[] args)
        {
        Scanner in=new Scanner(System.in);//选择了用Scanner处理输入数据
        while(in.hasNextInt())//因测试数据有多组,所以用了while()循环
            {
        int monstersNum=in.nextInt();
        int power=in.nextInt();
        int[] b=new int[monstersNum];
        for(int i=0;i<monstersNum;i++)
            {
            b[i]=in.nextInt();
        }
        power=yiGame(power,monstersNum,b);
        System.out.println(""+power);
        }
        in.close();
    }
    //打怪例程;
    public static int yiGame(int a,int n,int[] b)
        {
        int c=a;
        for(int i=0;i<n;i++)
            {
            if(b[i] <= c)
                {
                c+=b[i];
            }else
                {
                c+=gcd(b[i],c);
            }
        }
        return c;
    }
    //求最大公约数例程gcd辗转取余
    public static int gcd(int m,int n)
        {
        if(m < n)
            {
            int temp=m;
            m=n;
            n=m;
        }
        while(n!=0)
            {
            int yushu=m%n;
            m=n;
            n=yushu;
        }
        return m;
    }
}



题目二:炮台的攻击

兰博教训提莫之后,然后和提莫讨论起约德尔人,谈起约德尔人,自然少不了一个人,那 就是黑默丁格------约德尔人历史上最伟大的科学家. 提莫说,黑默丁格最近在思考一个问题:黑默丁格有三个炮台,炮台能攻击到距离它R的敌人 (两点之间的距离为两点连续的距离,例如(3,0),(0,4)之间的距离是5),如果一个炮台能攻击 到敌人,那么就会对敌人造成1×的伤害.黑默丁格将三个炮台放在N*M方格中的点上,并且给出敌人 的坐标. 问:那么敌人受到伤害会是多大?

输入描述:
第一行9个整数,R,x1,y1,x2,y2,x3,y3,x0,y0.R代表炮台攻击的最大距离,(x1,y1),(x2,y2),
(x3,y3)代表三个炮台的坐标.(x0,y0)代表敌人的坐标.
输出描述:
输出一行,这一行代表敌人承受的最大伤害,(如果每个炮台都不能攻击到敌人,输出0×)
输入例子:
1 1 1 2 2 3 3 1 2
输出例子:
2x
import java.util.*;
public class Main{
    public static void main(String[] args)
        {
        Scanner in=new Scanner(System.in);
        while(in.hasNextInt())
            {
            //攻击距离
            int r=in.nextInt();
            //三个炮台坐标
            int[] gun1=new int[2];
            int[] gun2=new int[2];
            int[] gun3=new int[3];
            gun1[0]=in.nextInt();
            gun1[1]=in.nextInt();
            gun2[0]=in.nextInt();
            gun2[1]=in.nextInt();
            gun3[0]=in.nextInt();
            gun3[1]=in.nextInt();
            //enemy坐标
            int[] enemy=new int[2];
            enemy[0]=in.nextInt();
            enemy[1]=in.nextInt();
            //计算
            int count=0;
            if(is_attacked(r,gun1,enemy))
                count++;
            if(is_attacked(r,gun2,enemy))
                count++;
            if(is_attacked(r,gun3,enemy))
                count++;
            System.out.println(count+"x");
        }
        in.close();
    }
    public static boolean is_attacked(int r,int[] gun,int[] enemy)
        {
        double distance=Math.sqrt(Math.pow(gun[0]-enemy[0],2)+Math.pow(gun[1]-enemy[1],2));
        return distance <= r?true:false;
    }
}

题目三:扫描透镜

在N*M的草地上,提莫种了K个蘑菇,蘑菇爆炸的威力极大,兰博不想贸然去闯,而且蘑菇是隐形的.只 有一种叫做扫描透镜的物品可以扫描出隐形的蘑菇,于是他回了一趟战争学院,买了2个扫描透镜,一个 扫描透镜可以扫描出(3*3)方格中所有的蘑菇,然后兰博就可以清理掉一些隐形的蘑菇. 问:兰博最多可以清理多少个蘑菇?
注意:每个方格被扫描一次只能清除掉一个蘑菇。 
输入描述:
第一行三个整数:N,M,K,(1≤N,M≤20,K≤100),N,M代表了草地的大小;
接下来K行,每行两个整数x,y(1≤x≤N,1≤y≤M).代表(x,y)处提莫种了一个蘑菇.
一个方格可以种无穷个蘑菇.
输出描述:
输出一行,在这一行输出一个整数,代表兰博最多可以清理多少个蘑菇.
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        while(in.hasNextInt())
            {
            //初始化矩阵和矩阵中的蘑菇
            //严格按照题目要求的输入规则赋值
            int rows=in.nextInt();
            int cols=in.nextInt();
            int[][] matrix=new int[rows][cols];
            int k=in.nextInt();
            for(int i=0;i<k;i++)
                {
                int x=in.nextInt();
                int y=in.nextInt();
                matrix[x-1][y-1]++;
            }
            //扫描蘑菇
            int first=doitRanbo(matrix,rows,cols);
            int second=doitRanbo(matrix,rows,cols);
            int total=first+second;
            System.out.println(""+total);
        }
        in.close();
    }
    //Ranbo do it!!!
    public static int doitRanbo(int[][] matrix,int rows,int cols)
        {
        int max=0;
        int row=0;
        int col=0;
        for(int i=0;i<=rows-3;i++)
            {
            for(int j=0;j<=cols-3;j++)
                {
                int count=countNums(matrix,i,j);
                if(count > max)//找到蘑菇最多的3*3的小矩阵
                    {
                    max=count;
                    row=i;
                    col=j;
                }
                if(max == 9)
                    {
                    decline1(matrix,row,col);
                    return 9;
                }
            }
        }
        decline1(matrix,row,col);
        return max;
    }
    //统计每个小矩形中的蘑菇数量
    public static int countNums(int[][] matrix,int row,int col)
        {
        int count=0;
        for(int i=row;i<=row+2;i++)
            {
            for(int j=col;j<=col+2;j++)
                {
                if(matrix[i][j] > 0)
                    count++;
            }
        }
        return count;
    }
    //摧毁蘑菇!!!
    public static void decline1(int[][] matrix,int row,int col)
        {
        for(int i=row;i<=row+2;i++)
            {
            for(int j=col;j<=col+2;j++)
                {
                matrix[i][j]--;
            }
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值