「计蒜客」机器人
前言:
看了很多博主寫的博客,對于基礎(chǔ)不好的我,看的很是吃力,于是寫出這一篇易懂的方法。
一.題目描述
蒜頭君收到了一份禮物,是一個(gè)最新版的機(jī)器人。這個(gè)機(jī)器人有 444 種指令:
現(xiàn)在把機(jī)器人放在坐標(biāo)軸原點(diǎn),起始朝向?yàn)?x 軸正方向。經(jīng)過一系列指令以后,你能告訴蒜頭君機(jī)器人的坐標(biāo)位置嗎。坐標(biāo)軸上一個(gè)單位長度表示 1米。
輸入格式:
第一行輸入一個(gè)整數(shù) n(1≤n≤100 表示指令的個(gè)數(shù)。
接下里 n 行,每行輸入形如上面的指令,其中 ?1000≤x≤1000
輸出格式:
輸出兩個(gè)整數(shù) x,yx,yx,y 表示機(jī)器人最后坐標(biāo)。用空格隔開。
樣例輸入
10 back -9 left 3 left 8 back 15 right 10 right -7 right -3 left 11 right 17 left 3樣例輸出
9 -7二.算法分析
這道題這個(gè)機(jī)器人的走法是:先改變方向,再走;再以原來方向的基礎(chǔ)上,改變方向…
1.定義數(shù)組
我們需要定義兩個(gè)數(shù)組來定義他的方向
定義這個(gè)數(shù)組的方式就和坐標(biāo)系有關(guān)
定義方向的數(shù)組可以順時(shí)針定義或逆時(shí)針定義(這里選擇逆時(shí)針定義)
由此我們根據(jù)順序可以定義出方向數(shù)組
dx = [0,-1,0,1]
dy = [1,0,-1,0]
因?yàn)檫@個(gè)機(jī)器人開始的時(shí)候方向是面向x軸正半軸
就相當(dāng)于以我設(shè)置的這個(gè)方向逆時(shí)針走三步,則到機(jī)器人現(xiàn)在的方向
所以d = 3,dx[d],dy[d]就表示現(xiàn)在機(jī)器人的方向
2.我們要分析機(jī)器人的走向
- 假如機(jī)器人向后走,那么就像我們體育課向后轉(zhuǎn)一樣,我們要連續(xù)向左轉(zhuǎn)兩次.
故: d = (d + 2) % 4; - 假如機(jī)器人向右走,那么我們要連續(xù)向左轉(zhuǎn)三次(因?yàn)槲覀兌x就是逆時(shí)針旋轉(zhuǎn))
故: d = (d + 3) % 4; - 假如機(jī)器人向左走,那么我們向左轉(zhuǎn)一次。
故: d = (d + 1) % 4;
三.代碼實(shí)現(xiàn)
public class _20機(jī)器人 {public static void main(String args[]){int[] dx = new int[]{0,-1,0,1};int[] dy = new int[]{1,0,-1,0};int nowx = 0; //開始時(shí)機(jī)器人的坐標(biāo)int nowy = 0;int d = 3; //剛開始,機(jī)器人是面向x軸正半軸Scanner sc = new Scanner(System.in);int n = sc.nextInt();for(int i = 0 ; i < n ; i++){String s = sc.next();int N = sc.nextInt();if(s.equals("back")){d = (d + 2) % 4;} else if(s.equals("left")){d = (d + 1) % 4;}else if(s.equals("right")){d = (d + 3) % 4;}nowx += dx[d] * N;nowy += dy[d] * N;}System.out.println(nowx+" "+nowy);} }第一次寫博客,大家有什么看不懂的地方,大家可以回復(fù)我,我會(huì)及時(shí)回復(fù)。若有地方寫的不好,或者寫的不對的地方,也希望大家可以幫忙揪出來嘻嘻嘻嘻。希望大家一起變成優(yōu)秀的學(xué)習(xí)冠軍。
總結(jié)
- 上一篇: java-php-net-python-
- 下一篇: 中泰资管天团丨如何用量化复制巴菲特?