java实现马踏棋盘问题

马踏棋盘问题:将马随机放在国际象棋的8×8棋盘chese[0~7][0~7]的某个方格中,马按走棋规则进行移动。要求每个方格只进入一次,走遍棋盘上全部64个方格。编制程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入一个8×8的方阵,输出之。

将棋盘长和宽定义为常量,方便测试时修改:

private final int X=8;
private final int Y=
8;

    先定义一个Point类,为马在棋盘中的坐标

class Point{
	int x;
	int y;
	
	public Point(int x,int y){
		this.x=x;
		this.y=y;
	}
}
     马在棋盘中每一点,有八个方向可以走:

                                                            

        找到下一点的代码为:

       

private Point getNext(Point p,int count){
		int x=p.x;
		int y=p.y;
		Point point;
		
		switch(count){
		case 0:
			if(x+2 
   
   
    
    =0 && chese[x+2][y-1]==0){
				x=x+2;
				y=y-1;
				point=new Point(x,y);
				return point;
			}
			break;
		case 1:
			if(x+2 
    
    
     
     = 0 && y+2 
     
     
      
      =0 && y+1 
      
      
       
       =0 && y-1 >=0 && chese[x-2][y-1]==0){
				x=x-2;
				y=y-1;
				point=new Point(x,y);
				return point;
			}
			break;
		case 6:
			if(x-1 >=0 && y-2 >=0 && chese[x-1][y-2]==0){
				x=x-1;
				y=y-2;
				point=new Point(x,y);
				return point;
			}
			break;
		case 7:
			if(x+1 
       
       
         =0 && chese[x+1][y-2]==0){ x=x+1; y=y-2; point=new Point(x,y); return point; } break; default: break; } return null; } } 
       
      
      
     
     
    
    
   
   

 每次寻找下一点时,都是从1处开始,如果1处符合条件,把1处标记为遍历过,把1点处当作当前点,再寻找它的下一点。我们每次寻找下一点从1点处开始,如果1处不符合条件,即已经遍历过,或者越出棋盘边界,则检查2处是否合格,如果八个点都没有出路,则回溯到上一点处。
遍历的代码为
private int travelChessBoard(Point start,int tag){
		int count=0;
		int x=start.x;
		int y=start.y;
		
		Point next;
		
		chese[x][y]=tag;
		
		if(tag == X*Y){
			print();
			return 1;
		}
		
		//找到下一个点next
		next=getNext(start,count);
		while(next == null && count <= 7){
			count++;
			next=getNext(start,count);
		}
		
		while(next != null){
			if(travelChessBoard(next, tag+1)==1){
				return 1;
			}
			
			count++;
			next=getNext(start,count);
			while(next == null && count <= 7){
				count++;
				next=getNext(start,count);
			}
		}
		
		if(next == null){
			chese[x][y]=0;
		}
		return 0;
	}
其中tag标志已经遍历过,tag的初始值为1,以后每次递归时都加1,当tag=64时,即为遍历结束。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值