您的位置:首页 > 其它

拼图最后两张图片异位问题的解决

2015-10-08 08:40 253 查看
// 初始化图片
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问题

这种情况就需要倒置数进行判断  

当拼图的行数为偶数时,倒置数为奇偶都可以

当拼图的行列数为奇数时,

如果空白图片从最底层往上数是奇数,倒置数则需要为偶数

如果空白图片从最底层往上数是偶数,倒置数则需要为奇数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息