骑士走棋盘

《骑士走棋盘》《骑士走棋盘》

/**
 * @author Administrator
 *骑士走棋盘问题:
 *先走较难走的位置
 *但是可能不会有合适解
 */
public class KnightTour {
	
	private static final int ROW = 8;
	private static final int COLUMN = 8;
	private static KnightTour kt = new KnightTour();
	//棋盘,初始值为0,表示该点未被走过
	public static int board[][]= new int[ROW][COLUMN];
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		
		int startx,starty;
		System.out.println("请输入起点");
		startx = 0;
		starty = 0;
		
		//System.out.println(kt.travel(0, 0));
		if(kt.travel(startx,starty)== 1)
			System.out.println("游历完成");
		else
			System.out.println("游历失败");
		
		for(int i=0;i<ROW;i++)
		{
			for(int j=0;j<COLUMN;j++)
				System.out.print("  " + board[i][j]);
			System.out.println();
		}
	}
	public int travel(int x,int y)
	{
		//8个方向
		int ktmovex[] = {-2,-1,1,2,2,1,-1,-2};
		int ktmovey[] = {1,2,2,1,-1,-2,-2,-1};
		
		//测试下一步走法
		int nexti[] = new int[8];
		int nextj[] = new int[8];
		
		//记录出路的个数
		int exists[] = new int[ROW];
		
		int i,j,l,m;
		int tempi,tempj;
		int count,min,temp;
		
		i = x;
		j = y;
		board[i][j] = 1;
		for(m=2;m<=ROW*COLUMN;m++)
		{
			for(l=0;l<ROW;l++)
				exists[l] = 0;
			l = 0;
			
			//试探8个方向
			for(int k = 0;k < 8;k ++)
			{
				tempi = i + ktmovex[k];
				tempj = j + ktmovey[k];
				
				//到达边界,不可走
				if(tempi < 0 || tempj < 0||tempi > ROW-1|| tempj > COLUMN-1)
					//return 0;
					continue;
					
				//若该方向可走,记录
				if(board[tempi][tempj] == 0)
				{
					nexti[l] = tempi;
					nextj[l] = tempj;
					
					//可走方向加1
					l ++;
				}
				//System.out.println(l);
			}
			count = l;
			//System.out.println(count + "$");
			//如果可走方向个数为0,直接返回
			if(count == 0)
				return 0;
			else if(count == 1)
			{
				//仅有一个可走方向,该方向即为最少出路方向
				min = 0;
			}
			else
			{
				//找出下一个位置的出路数
				for(l=0;l<count;l++)
				{
					for(int k=0;k<ROW;k++)
					{
						tempi = nexti[l] + ktmovex[k];
						tempj = nextj[l] + ktmovey[k];
						if(tempi<0||tempj<0||tempi>ROW-1||tempj>COLUMN-1)
							continue;
						if(board[tempi][tempj] == 0)
							exists[l] ++;
					}
				}
			}
			temp = exists[0];
			min = 0;
			//从可走的方向最少出路方向
			for(l=1;l<count;l++)
			{
				if(exists[l] < temp)
				{
					temp = exists[l];
					min = l;
				}
			}
			//走最少出路数方向
			i = nexti[min];
			j = nextj[min];
			board[i][j] = m;
		}
		return 1;
	}
}
    原文作者:骑士周游问题
    原文地址: https://blog.csdn.net/XxuelangL/article/details/21230497
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞