最近学习了Java图形界面的编程,写一个八数码bfs的代码,和大家分享一下。
同时这份代码也是我的期末大作业。
逻辑层
package com.EightNumber.view;
import java.util.*;
public class EightNumPath {
final static int dx[] = {-1, 1, 0, 0};
final static int dy[] = { 0, 0,-1, 1};
final static String dir = "UDLR";
static int maxstate = 400000;
static int [][]st = new int[maxstate][9];
static int []goal = {1,2,3,4,5,6,7,8,0};
static int []dist = new int[maxstate];
static int []fa = new int[maxstate];
static int []move = new int[maxstate];
static boolean []vis = new boolean[maxstate];
static int []fact = new int[9];
static StringBuffer path;
public static boolean isok(int []a) {
int sum=0;
for(int i=0; i < 9; i++)
for(int j=i+1; j < 9; j++)
if(a[j] != 0 && a[i] != 0 && a[i] > a[j])
sum++;
if(sum % 2 == 0) {
return true;
}
return false;
}
private static void init_lookup_table() {
fact[0] = 1;
for(int i = 1; i < 9; i++) {
fact[i] = fact[i-1] * i;
}
Arrays.fill(vis, false);
}
private static boolean try_to_insert(int s) {
int code = 0;
for(int i = 0; i < 9; i++) {
int cnt = 0;
for(int j = i+1; j < 9; j++) {
if(st[s][j] < st[s][i]) {
cnt++;
}
}
code += fact[8-i] * cnt;
}
if(vis[code]) {
return false;
}
return vis[code] = true;
}
private static void print_path(int cur) {
while(cur != 1) {
path.insert(0,dir.charAt(move[cur]));
cur = fa[cur];
}
}
private static int bfs() {
init_lookup_table();
int front = 1 , rear = 2;
try_to_insert(front);
while(front < rear) {
if(A