拼圖最後兩張圖片異位問題的解決

	// 初始化圖片
	public void initView() {

		for (int i = 0; i < number.length; i++) {
			number[i] = gameover[i];

		}
		// 將圖片隨機化

		for (int i = 0; i < number.length - 4; i++) {
			int temp = number[i];
			int index = (int) (Math.random() * (number.length - 5));
			number[i] = number[index];
			number[index] = temp;

		}
		initGame();
		getlist();
		// 判斷生成是否有解
		if (canSolve(data)) {
			return;
		} else {
			initView();
		}
		socer = 0;
		tv2.setText("當前移動了 " + String.valueOf(socer) + " 步");

	}

	// 將圖片添到佈局
	public void initGame() {
		for (int i = 0; i < 5; i++) {
			for (int j = 0; j < 5; j++) {
				if (j + i == 8) {
					iv_group[i][j].setImageResource(number[24]);
				} else {
					iv_group[i][j].setImageResource(number[i * 5 + j]);
				}
			}

		}
	}

	/**
	 * 獲取data
	 * 
	 */
	public void getlist() {
		data = new ArrayList<Integer>();
		for (int i = 0; i < number.length - 4; i++) {
			for (int j = 0; j < number.length - 4; j++) {
				if (number[i] == gameover[j]) {
					data.add(j);
				}
			}

		}

		System.out.println("============" + data.toString());
	}

	/**
	 * 該數據是否有解
	 * 
	 * @param data
	 * @return 該數據是否有解
	 */
	public boolean canSolve(List<Integer> data) {
		// 可行性原則
		return getInversions(data) % 2 == 0;
	}

	/**
	 * 計算倒置和算法
	 * 
	 * @param data
	 * @return 該序列的倒置和
	 */
	public static int getInversions(List<Integer> data) {
		int inversions = 0;
		int inversionCount;
		for (int i = 0; i < data.size(); i++) {
			inversionCount = 0;
			for (int j = i + 1; j < data.size(); j++) {
				int index = data.get(i);
				if (data.get(j) < index) {
					inversionCount++;
				}

			}
			inversions += inversionCount;
			inversionCount = 0;
		}
		System.out.println("******" + data.toString() +"============"+ inversions);
		return inversions;

	}

拼圖遊戲雖說簡單,但是當拼圖的行列數是奇數時,就會出現著名的puzzle問題


這種情況就需要倒置數進行判斷  


當拼圖的行數爲偶數時,倒置數爲奇偶都可以

當拼圖的行列數爲奇數時,

如果空白圖片從最底層往上數是奇數,倒置數則需要爲偶數

如果空白圖片從最底層往上數是偶數,倒置數則需要爲奇數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章