【华为机试018】坐标移动

题目描述:

开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。

Java实现:

/*先把字符串用;分隔
*再依次判断坐标是否有效
*无效直接跳过
*有效进行switch case判断并移动坐标点
*/

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
        String input = sc.nextLine();
        if (input == "") continue;
        String[] list = input.split(";"); 
       
        int x = 0;
        int y = 0;
        for (int i = 0; i < list.length; i++) {
            if (list[i].matches("[ASDW]\\d{1,2}")) {
                char dir = list[i].charAt(0);
                int num = Integer.parseInt(list[i].substring(1,list[i].length()));
                switch(dir){
                    case 'A' :
                        x -= num;
                        break;
                    case 'D' :
                        x += num;
                        break;
                    case 'W' :
                        y += num;
                        break;
                    case 'S' :
                        y -= num;
                        break;
                }
            }
        }
        System.out.println(x + "," + y);//用system.out.printf()会报错
    }
    }
    /*
   static Boolean isValid(String s) {
        if (s == "") {
            return false;
        }
        
        if (s.length() > 3 || s.length() < 2) {
            return false;
        }
        
        if (s.charAt(0) != 'A' && s.charAt(0) != 'D' && s.charAt(0) != 'W' && s.charAt(0) != 'S') {
            return false;
        }
        
        if (s.charAt(1) < '0' || s.charAt(1) > '9') {
            return false;
        }
        
        if (s.length() == 3 && (s.charAt(2) < '0' || s.charAt(2) > '9')) {
            return false;
        }
        
        return true;
    }
    */
}

知识点:

  • 将自己实现的判断字符串合法性的函数换成一个很简单的正则表达式,list[i].matches("[ASDW]\\d+"),其中[ASDW]表示A或S或D或W,\\d表示数字0-9,+表示前一个类型的字符存在一次或多次,X{n,m}表示X至少n此最多m次
  • String类中的split()方法可以将一个字符串按照给定的模式分隔到一个字符串数组中
提供的参考引用未涉及华为中贪吃蛇相关的题目、解题思路或代码示例等内容。不过一般华为中的贪吃蛇题目可能会模拟经典贪吃蛇游戏的场景,例如在一个二维网格地图上,贪吃蛇移动、吃食物变长、撞到边界或自己身体死亡等。 以下是一个简单的贪吃蛇游戏模拟代码示例,假设地图是一个二维数组,蛇用坐标列表表示,食物随出现在地图上: ```python import random # 地图大小 MAP_WIDTH = 10 MAP_HEIGHT = 10 # 初始化地图 def init_map(): return [[' ' for _ in range(MAP_WIDTH)] for _ in range(MAP_HEIGHT)] # 初始化蛇 def init_snake(): return [(0, 0)] # 随生成食物 def generate_food(snake): while True: x = random.randint(0, MAP_WIDTH - 1) y = random.randint(0, MAP_HEIGHT - 1) if (x, y) not in snake: return (x, y) # 打印地图 def print_map(map, snake, food): for y in range(MAP_HEIGHT): for x in range(MAP_WIDTH): if (x, y) in snake: print('S', end=' ') elif (x, y) == food: print('F', end=' ') else: print(map[y][x], end=' ') print() # 移动蛇 def move_snake(snake, direction): head = snake[0] if direction == 'up': new_head = (head[0], head[1] - 1) elif direction == 'down': new_head = (head[0], head[1] + 1) elif direction == 'left': new_head = (head[0] - 1, head[1]) elif direction == 'right': new_head = (head[0] + 1, head[1]) snake.insert(0, new_head) return snake # 主游戏循环 def game_loop(): map = init_map() snake = init_snake() food = generate_food(snake) while True: print_map(map, snake, food) direction = input("请输入移动方向 (up/down/left/right): ") snake = move_snake(snake, direction) # 检查是否吃到食物 if snake[0] == food: food = generate_food(snake) else: snake.pop() # 检查是否撞到边界或自己 head = snake[0] if head[0] < 0 or head[0] >= MAP_WIDTH or head[1] < 0 or head[1] >= MAP_HEIGHT or head in snake[1:]: print("游戏结束!") break if __name__ == "__main__": game_loop() ``` 解题思路一般是先对游戏的各种元素(地图、蛇、食物)进行初始化,然后在主循环中不断获取用户输入的移动方向,更新蛇的位置,检查是否吃到食物、是否撞到边界或自己等情况。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值