我需要找到8个拼图状态的线性冲突,状态用int[8]表示,目标状态是{1,2,3,4,5,6,7,8,0}。如果在一行中应该在该行中的两个瓷砖被颠倒,则线性冲突将是。例如,在目标状态下,第一行是 1,2,3,如果在状态下第一行是 2,1,3,那么这是瓷砖 2 和 1 产生的线性冲突。
我的代码可以工作,但是太长且笨拙。这里是:
public static int linearConflicts(int[] state) {
ArrayList<Integer> row1 = new ArrayList<Integer>();
ArrayList<Integer> row2 = new ArrayList<Integer>();
ArrayList<Integer> row3 = new ArrayList<Integer>();
ArrayList<Integer> column1 = new ArrayList<Integer>();
ArrayList<Integer> column2 = new ArrayList<Integer>();
ArrayList<Integer> column3 = new ArrayList<Integer>();
int[] columnMarkers = new int[] { 0, 3, 6, 1, 4, 7, 2, 5, 8 };
for (int i = 0; i < 9; i++) {
if (i < 3) {
row1.add(state[i]);
column1.add(state[columnMarkers[i]]);
} else if (i < 6) {
row2.add(state[i]);
column2.add(state[columnMarkers[i]]);
} else {
row3.add(state[i]);
column3.add(state[columnMarkers[i]]);
}
}
return row1Conflicts(row1) + row2Conflicts(row2) + row3Conflicts(row3)
+ column1Conflicts(column1) + column2Conflicts(column2)
+ column3Conflicts(column3);
}
public static int row1Conflicts(ArrayList<Integer> rowState) {
int conflicts = 0;
if (rowState.contains(1)) {
if ((rowState.contains(2))
&& rowState.indexOf(1) > rowState.indexOf(2)) {
conflicts++;
}
if ((rowState.contains(3))
&& rowState.indexOf(1) > rowState.indexOf(3)) {
conflicts++;
}
}
if (rowState.contains(2) && rowState.contains(3)
&& rowState.indexOf(2) > rowState.indexOf(3))
conflicts++;
return conflicts;
}
public static int row2Conflicts(ArrayList<Integer> rowState) {
int conflicts = 0;
if (rowState.contains(4)) {
if ((rowState.contains(5))
&& rowState.indexOf(4) > rowState.indexOf(5)) {
conflicts++;
}
if ((rowState.contains(6))
&& rowState.indexOf(4) > rowState.indexOf(6)) {
conflicts++;
}
}
if (rowState.contains(5) && rowState.contains(6)
&& rowState.indexOf(5) > rowState.indexOf(6))
conflicts++;
return conflicts;
}
public static int row3Conflicts(ArrayList<Integer> rowState) {
int conflicts = 0;
if (rowState.contains(7) && rowState.contains(8)
&& rowState.indexOf(7) > rowState.indexOf(8))
conflicts++;
return conflicts;
}
public static int column1Conflicts(ArrayList<Integer> columnState) {
int conflicts = 0;
if (columnState.contains(1)) {
if ((columnState.contains(4))
&& columnState.indexOf(1) > columnState.indexOf(4)) {
conflicts++;
}
if ((columnState.contains(7))
&& columnState.indexOf(1) > columnState.indexOf(7)) {
conflicts++;
}
}
if (columnState.contains(4) && columnState.contains(7)
&& columnState.indexOf(4) > columnState.indexOf(7))
conflicts++;
return conflicts;
}
public static int column2Conflicts(ArrayList<Integer> columnState) {
int conflicts = 0;
if (columnState.contains(2)) {
if ((columnState.contains(5))
&& columnState.indexOf(2) > columnState.indexOf(5)) {
conflicts++;
}
if ((columnState.contains(8))
&& columnState.indexOf(2) > columnState.indexOf(8)) {
conflicts++;
}
}
if (columnState.contains(5) && columnState.contains(8)
&& columnState.indexOf(5) > columnState.indexOf(8))
conflicts++;
return conflicts;
}
public static int column3Conflicts(ArrayList<Integer> columnState) {
int conflicts = 0;
if (columnState.contains(3) && columnState.contains(6)
&& columnState.indexOf(3) > columnState.indexOf(6))
conflicts++;
return conflicts;
}
任何人都知道如何做到更短,更不笨拙。如果我继续这样做,我的代码将很难阅读。