import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import java.util.Stack;
public class come{
public static void main(String[] args) {
TU tu=new TU(64);
tu.seach(2);//1~64
}
public static int[] Tiao(int a) {//返回下一步的位置
int row=0;//行数 0 开始
int clo=a;//列数 1开始
int tiao[][]=new int[8][2];//一共 最多八个位置 0 为行 1 为 列
if(a>8) {
row=a%8==0 ? a/8-1:a/8;//可以整除 -1
clo=a-row*8;//数 减去 行数乘8 就是 列数
}
tiao[0][0]=row-1;
tiao[0][1]=clo-2;
tiao[1][0]=row+1;
tiao[1][1]=clo-2;
tiao[2][0]=row+2;
tiao[2][1]=clo-1;
tiao[3][0]=row-2;
tiao[3][1]=clo-1;
tiao[4][0]=row+2;
tiao[4][1]=clo+1;
tiao[5][0]=row-2;
tiao[5][1]=clo+1;
tiao[6][0]=row+1;
tiao[6][1]=clo+2;
tiao[7][0]=row-1;
tiao[7][1]=clo+2;
int []okok=new int[8];
for (int i = 0; i < tiao.length; i++) {
if(tiao[i][0]>=0&&tiao[i][0]<8&&tiao[i][1]>0&&tiao[i][1]<9) {
okok[i]=tiao[i][0]*8+tiao[i][1];//把二维地址转一维地址
}
}
return okok;
}
}
class TU{
boolean []visited;//是否经过位置
int tua[];//存放位置
public TU(int size) {
visited=new boolean[size];
tua=new int[size];
}
public void seach(int v) {
zo(v,1);
for (int i = 0; i < tua.length; i++) {
System.out.print(tua[i]+" ");
if((i+1)%8==0)
System.out.println();
}
System.out.println(count);
}
public static int count=1;
public static boolean succeed=false;
public void zo(int a,int step) {
tua[a-1]=step;
Stack<Integer> eee=new Stack();
visited[a-1]=true;
count++;
if(count%100000==0)
System.out.println("运行第"+count+"次");
int []weia=come.Tiao(a);//取得下一步位置
for (int i = 0; i <weia.length ; i++) {
if(weia[i]!=0)//不能为默认值 代表没有位置
eee.push(weia[i]);
}
while(!eee.isEmpty()) {
int hh=eee.pop();
if(!visited[hh-1])//没有访问就去访问
zo(hh,step+1);
}
if(step<tua.length&&!succeed) {
tua[a-1]=0;//死亡 要不就 无解 重新打0 为没有
visited[a-1]=false;
}else {
succeed=true;
}
}
}
又花了一下午唉,脑子疼