拼图最后两张图片异位问题的解决 | 您所在的位置:网站首页 › 两张图片拼图怎么换位置 › 拼图最后两张图片异位问题的解决 |
// 初始化图片
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();
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 data) {
// 可行性原则
return getInversions(data) % 2 == 0;
}
/**
* 计算倒置和算法
*
* @param data
* @return 该序列的倒置和
*/
public static int getInversions(List 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问题
这种情况就需要倒置数进行判断
当拼图的行数为偶数时,倒置数为奇偶都可以 当拼图的行列数为奇数时, 如果空白图片从最底层往上数是奇数,倒置数则需要为偶数 如果空白图片从最底层往上数是偶数,倒置数则需要为奇数 |
CopyRight 2018-2019 实验室设备网 版权所有 |