〇 X 〇 〇 〇
〇 〇 〇 〇 〇
〇 〇 〇 〇 〇
〇 〇 〇 〇 〇
〇 〇 〇 〇 〇
不过X点,把所有的圈连起来,不能重复,不能斜连,不能跳圈
本人用了游戏寻路算法做了一个程序,没有解出答案,如果差一个圈的有1064个解法。欢迎高手们解答
import java.util.ArrayList;
/**
* @author xtiger (xtiger@microsoul.com) 2015-09-09 23:39
*/
public class Game {
private static int[][] t = new int[7][7]; //记录圈子,外围多加一圈,免得判断 ,0:可以走,1:走过,2:不可走
private static int r[] = new int[25]; //记录结果
private static int i = 2; //当前圈子的x
private static int j = 1; //当前圈子的y
private static int idx = 0;
private static int bb = 1;
private static ArrayList<String> die = new ArrayList<String>(); //记录走不通的路线
public static void main(String[] args) {
for (int i = 0; i < 7; i++) {
for (int j = 0; j < 7; j++) {
if (i == 0) {
t[i][j] = 2;
}
if (i == 6) {
t[i][j] = 2;
}
if (j == 0) {
t[i][j] = 2;
}
if (j == 6) {
t[i][j] = 2;
}
}
}
t[1][2] = 2;
t[1][1] = 2;
t[2][1] = 2;
r[idx++] = 11;
r[idx++] = 21;
while (true) {
if (up() == 1) continue;
if (right() == 1) continue;
if (down() == 1) continue;
if (left() == 1) continue;
back();
int b = 0;
for (int x = 1; x <= 5; x++) {
for (int y = 1; y <= 5; y++) {
b += t[x][y];
}
}
if (b == 26) {
echo1();
continue;
}
if (b == 28) break;
}
System.out.println("GOOOOOOOOOOD---------------");
echo1();
}
private static int up() {
if (checkDie((i - 1) * 10 + j)) {
return 0;
}
if (t[i - 1][j] == 0) {
r[idx++] = (i - 1) * 10 + j;
t[i - 1][j] = 1;
i--;
return 1;
}
return -1;
}
private static int right() {
if (checkDie(i * 10 + j + 1)) {
return 0;
}
if (t[i][j + 1] == 0) {
r[idx++] = i * 10 + j + 1;
t[i][j + 1] = 1;
j++;
return 1;
}
return -1;
}
private static int down() {
if (checkDie((i + 1) * 10 + j)) {
return 0;
}
if (t[i + 1][j] == 0) {
r[idx++] = (i + 1) * 10 + j;
t[i + 1][j] = 1;
i++;
return 1;
}
return -1;
}
private static int left() {
if (checkDie(i * 10 + j - 1)) {
return 0;
}
if (t[i][j - 1] == 0) {
r[idx++] = i * 10 + j - 1;
t[i][j - 1] = 1;
j--;
return 1;
}
return -1;
}
private static boolean checkDie(int next) {
return die.contains(getPath(idx) + next + "/");
}
private static boolean back() {
String p = getPath(idx);
if (!die.contains(p))
die.add(getPath(idx));
if (idx > 0) {
idx--;
if (t[r[idx] / 10][r[idx] % 10] == 1) {
t[r[idx] / 10][r[idx] % 10] = 0;
}
}
if (idx > 0) {
i = r[idx - 1] / 10;
j = r[idx - 1] % 10;
return false;
}
return true;
}
private static String getPath(int pos) {
StringBuilder s = new StringBuilder();
for (int x = 0; x < pos; x++) {
s.append(r[x]).append("/");
}
return s.toString();
}
private static String getPos(int v) {
for (int x = 1; x <= 25; x++) {
if (r[x - 1] == v) return "" + (x + 10);
}
return " ";
}
private static void echo1() {
System.out.println();
System.out.println((bb++) + ". -----------");
for (int x = 1; x <= 5; x++) {
for (int y = 1; y <= 5; y++) {
System.out.print(getPos(10 * x + y) + " ");
}
System.out.println();
}
}
}
如果差一个圈的有1064个解法,展示一部分:
1. -----------
11 15 16 17
12 13 14 18
31 30 25 24 19
32 29 26 23 20
33 28 27 22 21
2. -----------
11 15 16 17
12 13 14 18
31 32 25 24 19
30 33 26 23 20
29 28 27 22 21
3. -----------
11 15 16 17
12 13 14 18
33 32 25 24 19
30 31 26 23 20
29 28 27 22 21
4. -----------
11 15 16 17
12 13 14 18
29 28 25 24 19
30 27 26 23 20
31 32 33 22 21