火星漫游者
描述:
 若干个火星漫游者(机器人)被NASA(美国国家航空和宇宙航行局)送到火星对火星的一个高原进行科学探测,这个高原是一个矩形,火星漫游者将漫游整个高原,并通过照相机对高原拍照,将照片发回地球,以了解这个高原的全貌。
 任意一个漫游者的位置将由x,y坐标和一个代表方向的字母确定(N-北,S-南,E-东,W-西),为了简化漫游,将高原划分为网格。例如(0,0,N)表示火星漫游者位于高原的左下角,方向朝北。
 NASA通过发送命令字符串控制火星漫游者,命令字符串是字符’L’,’R’,’M’的组合,’L’,’R’表示使漫游者向左或右旋转90°,但坐标不变;’M’表示使漫游者沿当前方向移动一个网格点,并保持方向不变。
 假设高原的正北方向是从点(x,y)到点(x,y+1)的方向
输入:
 输入采用文件,文件第一行是高原的右上角坐标,左下角坐标默认为(0,0)
 文件的剩余部分是每一个火星漫游者的信息,每一个火星漫游者有两行信息,第一行给出漫游者的初始位置,第二行是一系列控制漫游者的命令
 位置由两个整数和一个字母组成并用空格分隔,分别对应x,y坐标和方向
 每个漫游者按顺序漫游高原,即下一个漫游者必须在上一个漫游者结束漫游后才开始漫游。
输出:
 输出每一个漫游者的最终坐标和方向
输入输出示例:
 Test Input:
5 5
1 2 N
LMLMLMLMM
3 3 E
MMRMMRMRRM

 Expected Output:
1 3 N
5 1 E

解决方案 »

  1.   

    看上去有点像topcoder的竞赛题哦~~
      

  2.   

    好了,帮你搞定了,程序如下:
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;class GaoYuan {
        int x;
        int y;    public GaoYuan(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }class Explorer {
        public int x;
        public int y;
        public char a;    public Explorer(int x, int y, char a) {
            this.x = x;
            this.y = y;
            this.a = a;
        }    public void L() {
            if ('N' == a) {
                this.a = 'W';
            } else if ('W' == a) {
                this.a = 'S';
            } else if ('S' == a) {
                this.a = 'E';
            } else if ('E' == a) {
                this.a = 'N';
            }
        }    public void R() {
            if ('N' == a) {
                this.a = 'E';
            } else if ('E' == a) {
                this.a = 'S';
            } else if ('S' == a) {
                this.a = 'W';
            } else if ('W' == a) {
                this.a = 'N';
            }
        }    public void M() {
            if ('N' == a) {
                this.y += 1;
            } else if ('W' == a) {
                this.x -= 1;
            } else if ('S' == a) {
                this.y -= 1;
            } else if ('E' == a) {
                this.x += 1;
            }
        }
        
        public String toString() {
            return x + " " + y + " " + a;
        }
    }public class ExplorerMove {
        public static void main(String[] args) throws IOException {
            String temp;
            StringTokenizer st;
            BufferedReader bufferedReader = new BufferedReader(
                    new InputStreamReader(System.in));
            temp = bufferedReader.readLine();
            //st = new StringTokenizer(temp);
            //int x = Integer.valueOf(st.nextToken());
            //int y = Integer.valueOf(st.nextToken());
            //GaoYuan gaoYuan = new GaoYuan(x, y);
            for (int i = 1; i >= 0; i--) {
                temp = bufferedReader.readLine();
                st = new StringTokenizer(temp);
                int x1 = Integer.valueOf(st.nextToken());
                int y1 = Integer.valueOf(st.nextToken());
                char a = st.nextToken().charAt(0);
                Explorer explorer = new Explorer(x1, y1, a);
                temp = bufferedReader.readLine();
                for (int j = 0; j < temp.length(); j++) {
                    if ('L' == (temp.charAt(j))) {
                        explorer.L();
                    } else if ('R' == (temp.charAt(j))) {
                        explorer.R();
                    } else if ('M' == (temp.charAt(j))) {
                        explorer.M();
                    }
                }
                System.out.println(explorer);
            }
        }
    }说明:
    1、考虑到边界可能不只是5、5这样的个位数,故不能用chatAt方法读取,改成程序中的StringTokenizer方法来分割;
    2、程序中类似于this.y = +1;这样的地方都是错的,应该改成this.y += 1;
    3、this.a = +1;是错的,改成this.x += 1;(2和3的this我在程序中都去掉了)
    4、//int x = Integer.valueOf(st.nextToken());
       //int y = Integer.valueOf(st.nextToken());
       //GaoYuan gaoYuan = new GaoYuan(x, y);
    这几行代码程序中没用到,所以我注释掉了。当然,程序中也没用到GaoYuan这个类。
    5、如果设计得更好一些,还有一些地方需要提高,包括移动的过程中对于是否越界的判断和处理,包括NWSEM等字母大小写的兼容,包括对异常情况的处理等等。