【题目】【4天】寻宝

题目:

  1. 创建一个Web页面,它带有一幅图像,以及向玩家展示消息的地方
  2. 在地图上选取一个随机的点来埋宝藏
  3. 创建一个单机事件处理程序。每次玩家单机地图,这个单击事件处理程序都会做如下事情:
    a.将单击计数加1,并显示剩余次数
    b.计算单击位置距离宝藏位置有多远
    c.在Web页面上显示一条消息,告诉玩家离宝藏的距离
    d.如果玩家在宝藏上单击的点距离宝藏很近,恭喜玩家并显示他们用了多少次单击找到宝藏
<body>

    <img id="map" src="image/Img388582882.jpg" alt="藏宝图">

    <p>本游戏一共10次机会</p>
    <p id="clicks"></p>
    <p id="distance"></p>

    <script src="https://code.jquery.com/jquery-2.1.0.js"></script>
    <script>
        var height = 301;
        var width = 550;
        var clicks = 0;
       
        //随机函数
        function getrandomNumber(size) {
            return Math.floor(Math.random()*size);
        }
        
        //生成宝藏点
        var target = {
          x : getrandomNumber(width),
          y : getrandomNumber(height)
        };
        
        //console.log(target);
        
        //计算单击点和目标点之间的距离
        function getdistance(event, target) {
            var diffX = event.offsetX - target.x;
            var diffY = event.offsetY - target.y;
            //console.log(Math.sqrt(diffX * diffX + diffY * diffY));
            return Math.sqrt(diffX * diffX + diffY * diffY);
        }
        
        //向玩家展示距离目标还有多远
        function getDistanceHint(distance) {
            if(distance < 8) return alert("恭喜找到宝藏" + clicks);
            if(distance < 10) return"还差一点";
            else if(distance < 20) return"很近";
            else if(distance < 40) return"近";
            else  if(distance < 80) return"远";
            else if(distance < 160) return"很远";
            else if(distance < 320) return"非常远";
            else return"差的十万八千里";
        
        }
        
        //寻宝事件
        $("#map").click(function (event) {
            var limit = 1 + clicks++;
            if(clicks >= 0){
                var distance = getdistance(event,target);
                var distanceHint = getDistanceHint(distance);
                $("#distance").text(distanceHint);
                $("#clicks").text("次数: " + limit);
            }
        
            if(clicks > 10){alert("game over");}
        });
    </script>

</body>

bug:游戏结束后无法停止,还能继续寻宝。

### 2023年梯赛 L2 题目及解析 #### L2-1 堆宝塔 堆宝塔是一个经典的算法问题,主要考察选手对于动态规划的理解以及实现能力。题目描述如下:给定若干大小不同的石块,要求将其堆叠成一个稳定的宝塔结构。每一块石头可以放置在比它更大的石头之上,或者作为底部的基础。目标是最少使用多少层能够完成整个宝塔的构建。 解决方案通常涉及动态规划的思想,定义状态 `dp[i]` 表示前 `i` 块石头最少能构成几层宝塔[^1]。转移方程可以通过枚举当前石头放在哪一层来更新状态: ```cpp for (int i = 1; i <= n; ++i) { for (int j = s; j >= stones[i]; --j) { // s 是总容量 dp[j] = max(dp[j], dp[j - stones[i]] + value[i]); } } ``` --- #### L2-2 梯赛的赛场安排 此题旨在模拟实际比赛场景下的考场分配逻辑。具体来说,给出参赛人数、考场数量以及每个考场的最大容纳量,要求合理分配考生至各个考场,并满足特定约束条件(如尽量减少空位)。这是一道典型的贪心算法应用题。 解决方法是先按考生人数降序排列所有队伍,随后依次尝试将他们分配到剩余空间最大的考场中去。如果某个队无法完全进入同一间教室,则需拆分并记录额外所需房间数目。 伪代码展示如下: ```python def allocate_rooms(teams, room_capacities): teams.sort(reverse=True) # 按照团队规模从大到小排序 rooms_used = [] for team_size in teams: allocated = False for idx, capacity in enumerate(room_capacities): if capacity >= team_size and not any(r[idx] for r in rooms_used): # 如果该房间未被占用且可容纳当前队伍 rooms_used.append([False]*len(room_capacities)) rooms_used[-1][idx] = True allocated = True break if not allocated: return "Impossible" return len(rooms_used) ``` --- #### L2-3 锦标赛 锦标赛问题是关于淘汰制竞赛的日程编排与胜负预测。假设存在多支战队参与单败淘汰赛形式的比赛,初始阶段会随机配对两两对抗直到决出最终胜者为止。重点在于如何高效地表示这种树状关系以便快速查询任意轮次的结果。 一种常见做法是以二叉树的形式存储对阵情况,其中叶子节点代表初赛选手而内部节点则对应后续晋级环节。每次匹配胜利的一方便成为父结点继续向上挑战更高层次对手直至冠军诞生。 以下是创建锦标赛树的一个简单例子: ```java class TreeNode { String name; TreeNode left, right; public TreeNode(String val){ this.name = val; left = null; right = null; } static void buildTree(List<String> players, int start, int end, TreeNode root){ if(start > end || start >= players.size()) return ; int mid = (start+end)/2 ; root.left=new TreeNode(players.get(mid)); if((mid-1)>=start && (mid-1)<players.size()) buildTree(players,start,mid-1,root.left); if((mid+1)<=end && (mid+1)<players.size()){ root.right=new TreeNode(players.get(mid+1)); if(end>(mid+1))buildTree(players,mid+1,end,root.right); } } } ``` --- #### L2-4 寻宝寻宝图属于路径寻找类问题,在二维网格地图上标记起点终点以及其他障碍物位置之后,询问最短到达目的地所需的步数或是是否存在可行路线等问题。此类任务往往借助广度优先搜索(BFS)得以有效解答因为其逐层扩展特性非常适合用来探索最小移动距离方案。 下面提供了一个基于BFS求解迷宫问题的小型框架: ```c++ #include <queue> using namespace std; struct Node{ int x,y,dist; }; bool isValid(int newX,int newY,vector<string>& maze){ return newX>=0&&newX<maze.size()&&newY>=0&&newY<maze[0].size()&&maze[newX][newY]!='#'; } int bfs(vector<string> maze,pair<int,int> src,pair<int,int> dest){ queue<Node> q; vector<vector<bool>> visited(maze.size(),vector<bool>(maze[0].size(),false)); q.push({src.first,src.second,0}); visited[src.first][src.second]=true; while(!q.empty()){ auto curr=q.front();q.pop(); if(curr.x==dest.first && curr.y==dest.second)return curr.dist; int dx[]={-1,+1,0,0}; int dy[]={0,0,-1,+1}; for(int dir=0;dir<4;++dir){ int nx=curr.x+dx[dir]; int ny=curr.y+dy[dir]; if(isValid(nx,ny,maze)&&!visited[nx][ny]){ visited[nx][ny]=true; q.push({nx,ny,curr.dist+1}); } } } return -1;//no path found } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值