美团-棋子翻转-Java

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import org.junit.Test;

/**
 * 题目描述 在4x4的棋盘上摆满了黑白棋子,黑白两色的位置和数目随机其中左上角坐标为(1,1),右下角坐标为(4,4),
 * 现在依次有一些翻转操作,要对一些给定支点坐标为中心的 上下左右 四个棋子的颜色进行翻转,请计算出翻转后的棋盘颜色。
 * 给定两个数组A和f,分别为初始棋盘和翻转位置。其中翻转位置共有3个。请返回翻转后的棋盘。 测试样例:
 * [[0,0,1,1],[1,0,1,0],[0,1,1,0],[0,0,1,0]] , [[2,2],[3,3],[4,4]]
 * 返回:[[0,1,1,1],[0,0,1,0],[0,1,1,0],[0,0,1,0]]
 * 
 * @author 崔洪振367
 * @version 创建时间:2017年7月7日 下午1:01:55
 */
public class 棋子翻转 {
	/**
	 * 解题思路:
	 * 1、声明一个HashMap,<String , Integer>
	 * 2、遍历翻转数组,求出每个节点对应的四个节点位置,以字符串形式保存到hashmap键中,出现次数保存到值中 
	 * 3、遍历HashMap,修改原棋盘
	 */
	HashMap<String, Integer> hashMap = null;
	
	@Test
	public void test(){
		int[][] A = {{0,0,1,1},{1,0,1,0},{0,1,1,0},{0,0,1,0}};
		int[][] f = {{2,2},{3,3},{4,4}};
		int[][] result = flipChess(A, f);
		for(int i=0; i<result.length; i++){
			for(int j=0; j<result[0].length; j++){
				System.out.print(result[i][j] + ",");
			}
			System.out.println();
		}
	}

	public int[][] flipChess(int[][] A, int[][] f) {
		hashMap = new HashMap<>();

		int aLen = A.length;
		int aaLen = A[0].length;

		// 遍历翻转的矩阵,找出四个点的坐标
		for (int i = 0; i < f.length; i++) {// 题目中f.length的大小为3
			int point0 = f[i][0];
			int point1 = f[i][1];
			String hmKey = "";
			//上
			if ((point0 - 1) > 0 && (point0 - 1) <= aLen && point1 > 0 && point1 <= aaLen) {
				hmKey = (point0-1)+","+point1;
				addElementToHashMap(hashMap, hmKey);
			}
			//下
			if ((point0+1) > 0 && (point0+1) <= aLen && point1 > 0 && point1 <= aaLen) {
				hmKey = (point0+1)+","+point1;
				addElementToHashMap(hashMap, hmKey);
			}
			//左
			if (point0 > 0 && point0 <= aLen && (point1-1) > 0 && (point1-1) <= aaLen) {
				hmKey = point0+","+(point1-1);
				addElementToHashMap(hashMap, hmKey);
			}
			//右
			if (point0 > 0 && point0 <= aLen && (point1+1) > 0 && (point1+1) <= aaLen) {
				hmKey = point0+","+(point1+1);
				addElementToHashMap(hashMap, hmKey);
			}
		}
		
		//遍历HashMap,修改原棋盘
		Iterator<Entry<String, Integer>> iterator =  hashMap.entrySet().iterator();
		while(iterator.hasNext()){
			Map.Entry<String, Integer> entry = (Entry<String, Integer>) iterator.next();
			int v = entry.getValue();
			String k = entry.getKey();
			//System.out.println("key:"+k+","+"value:"+v);
			if(v%2!=0){
				String[] p = k.split(",");
				int x = Integer.parseInt(p[0]);
				int y = Integer.parseInt(p[1]);
				A[x-1][y-1] = A[x-1][y-1]==0?1:0;
			}
		}
		return A;
	}

	public void addElementToHashMap(HashMap<String, Integer> hp, String fz) {
		if (hashMap.containsKey(fz)) {
			int value = hashMap.get(fz);
			hashMap.put(fz, value+1);
		} else {
			hashMap.put(fz, 1);
		}
	}

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值