Google-APAC2015-"super 2048"

今天得知Sitong拿到了FB和Google的offer,觉得很强,恭喜恭喜。自己还得加把劲啊!

宇妹(这里宇妹和托雷斯“托妞”是一种概念 =W=)说春季想跳槽到LinkedIn,于是呼唤我和他一起刷Leetcode。我愉快地答应了。熟能生巧嘛。

早上和Parker聊了一下,他说他prefer中型公司,比如dropbox, LinkedIn,因为小公司的package好、可以学到更多东西而且可能IPO。大神果然是比我们高到不知道哪里去了。

下午在Silo写代码,很快就把2048这道题目写好了,没什么难度,上题:


原题:super 2048

=====================================

#1 题目理解:

N * N的2048游戏,然后给定移动方向,输出移动结果。(= 。=,如果没有玩过这个游戏赶紧去google一下2048)

一看题目的描述就知道是中国人写的,因为里面用了(no zuo no die),哈哈哈。果然是google在中国区的招聘题目,这么接地气。

=====================================

#2 算法:

这道题目还是挺简单明了的:

假设DIR == RIGHT,设定行指针是i,非空列指针是j,元素指针是p1, p2。
从右到左开始搜索,遇到非零元素,赋值p1;再次遇到,赋值p2。
只有p1 != null && p2 != null才继续操作。
如果&p1 == &p2,那么加起来,&j = &p1 + &p2,j--,把p1设为p2前一个。
如果&p1 != &p2,&j = &p1, j--,把p1设为p2。
记得把剩下的那个p1放到对应的 “ j ” 处。

=====================================

#3 数据结构:

int[][] board

=====================================

#4 代码:

import java.util.*;
import java.io.*;

public class Solution {
	public static void main(String[] args) {
		File inFile = new File("B-large-practice.in");
		File outFile = new File("B-large-practice.out");
		try {
			BufferedReader br = new BufferedReader(new FileReader(inFile));
			BufferedWriter bw = new BufferedWriter(new FileWriter(outFile));
			int T = Integer.parseInt(br.readLine());
			for (int i = 1; i <= T; i++) {
				String line = br.readLine();
				String[] parts = line.split("\\s");
				int N = Integer.parseInt(parts[0]);
				String DIR = parts[1];
				String[] lines = new String[N];
				for (int j = 0; j < N; j++) {
					lines[j] = br.readLine();
				}
				int[][] board = getBoard(lines);
				bw.write("Case #" + i + ":\n" + solve(N, DIR, board));
			}
			bw.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	// solve the super-2048
	public static String solve(int N, String DIR, int[][] board) {
		String s = "";
		switch(DIR) {
			case "up":
				s = up(N, board);
				break;
			case "down":
				s = down(N, board);
				break;
			case "left":
				s = left(N, board);
				break;
			case "right":
				s = right(N, board);
				break;
			default:
				break;
		}
		return s;
	}

	// move right
	public static String right(int N, int[][] board) {
		for (int i = 0; i < N; i++) {
			int j = N-1;
			int p1 = N-1;
			int p2;
			while (true) {
				while (p1 >= 0 && board[i][p1] == 0) p1--;
				if (p1 < 0) break;
				p2 = p1 - 1;
				while (p2 >= 0 && board[i][p2] == 0) p2--;
				if (p2 < 0) break;
				if (board[i][p1] == board[i][p2]) {
					board[i][j] = 2 * board[i][p1];
					p1 = p2 - 1;
				}
				else {
					board[i][j] = board[i][p1];
					p1 = p2;
				}
				j--;
			}
			if (p1 >= 0) {
				board[i][j] = board[i][p1];
				j--;
			}
			while (j >= 0 && j < N) {
				board[i][j] = 0;
				j--;
			}
		}
		return boardToStr(board);
	}

	// move left
	public static String left(int N, int[][] board) {
		for (int i = 0; i < N; i++) {
			int j = 0;
			int p1 = 0;
			int p2;
			while (true) {
				while (p1 < N && board[i][p1] == 0) p1++;
				if (p1 >= N) break;
				p2 = p1 + 1;
				while (p2 < N && board[i][p2] == 0) p2++;
				if (p2 >= N) break;
				if (board[i][p1] == board[i][p2]) {
					board[i][j] = 2 * board[i][p1];
					p1 = p2 + 1;
				}
				else {
					board[i][j] = board[i][p1];
					p1 = p2;
				}
				j++;
			}
			if (p1 < N) {
				board[i][j] = board[i][p1];
				j++;
			}
			while (j >= 0 && j < N) {
				board[i][j] = 0;
				j++;
			}
		}
		return boardToStr(board);
	}

	// move down
	public static String down(int N, int[][] board) {
		for (int j = 0; j < N; j++) {
			int i = N-1;
			int p1 = N-1;
			int p2;
			while (true) {
				while (p1 >= 0 && board[p1][j] == 0) p1--;
				if (p1 < 0) break;
				p2 = p1 - 1;
				while (p2 >= 0 && board[p2][j] == 0) p2--;
				if (p2 < 0) break;
				if (board[p1][j] == board[p2][j]) {
					board[i][j] = 2 * board[p1][j];
					p1 = p2 - 1;
				}
				else {
					board[i][j] = board[p1][j];
					p1 = p2;
				}
				i--;
			}
			if (p1 >= 0) {
				board[i][j] = board[p1][j];
				i--;
			}
			while (i >= 0 && i < N) {
				board[i][j] = 0;
				i--;
			}
		}
		return boardToStr(board);
	}

	// move up
	public static String up(int N, int[][] board) {
		for (int j = 0; j < N; j++) {
			int i = 0;
			int p1 = 0;
			int p2;
			while (true) {
				while (p1 < N && board[p1][j] == 0) p1++;
				if (p1 >= N) break;
				p2 = p1 + 1;
				while (p2 < N && board[p2][j] == 0) p2++;
				if (p2 >= N) break;
				if (board[p1][j] == board[p2][j]) {
					board[i][j] = 2 * board[p1][j];
					p1 = p2 + 1;
				}
				else {
					board[i][j] = board[p1][j];
					p1 = p2;
				}
				i++;
			}
			if (p1 < N) {
				board[i][j] = board[p1][j];
				i++;
			}
			while (i >= 0 && i < N) {
				board[i][j] = 0;
				i++;
			}
		}
		return boardToStr(board);
	}

	// convert board into string
	public static String boardToStr(int[][] board) {
		int N = board.length;
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				sb.append(board[i][j] + " ");
			}
			sb.append("\n");
		}
		return sb.toString();
	}

	// convert the string into board
	public static int[][] getBoard(String[] lines) {
		int N = lines.length;
		int[][] board = new int[N][N];
		for (int i = 0; i < N; i++) {
			String[] parts = lines[i].split("\\s");
			for (int j = 0; j < N; j++) {
				board[i][j] = Integer.parseInt(parts[j]);
			}
		}
		return board;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值