骑士周游 JAVA实现

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;
		}
	}
}

又花了一下午唉,脑子疼
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值