`
mushme
  • 浏览: 789984 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

寻找路径

 
阅读更多
package test;

import java.util.Scanner;

/**
 * 2017年4月23日
5
0 0 0 0 0 
1 1 1 1 0
0 0 0 0 0
0 1 1 1 1
0 0 0 0 0
8
0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0
0 1 1 1 1 0 0 1
0 1 0 1 1 1 0 1
0 0 1 0 0 0 0 1
0 1 1 0 1 0 0 0
0 0 1 1 1 1 1 1
0 0 0 0 0 0 0 0


 */
public class Solution06 {
	static Chess[][] chessArray;
	static boolean [][] mapChess;
	static boolean logger;
	static boolean workout;
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int test_case=2;
		for(int t=0;t<test_case;t++){
			chessArray=null;
			mapChess=null;
			workout=false;
			
			int size=sc.nextInt();
			int inputArray[][]=new int[size][size];
			mapChess=new boolean [size][size];
			for(int i=0;i<size;i++){
				for(int j=0;j<size;j++){
					inputArray[i][j]=sc.nextInt();
					
				}
			}
			
			chessArray=generateChessArray(inputArray);
			//System.out.println(chessArray[1][7].getChessStatus());
			process(chessArray[0][0],size);
		}
		
		sc.close();

	}
	
	

	private static void process(Chess chess,int size) {
		if(logger) System.out.println("遍历棋子:"+chess.iIndex+","+chess.jIndex);
		if(chess.iIndex==size-1 && chess.jIndex==size-1){
			StringBuffer sb=new StringBuffer();
			
			while(true){
				//System.out.println("访问 "+chess.iIndex+","+chess.jIndex);
				sb.insert(0, (chess.iIndex+1)+","+(chess.jIndex+1)+" ");
				if(chess.iIndex==0 && chess.jIndex==0){
					break;
				}else{
					chess=chess.preChess;
				}
			}
			System.out.println(sb.toString());
			workout=true;
			
		}else{
			for(int i=0;i<chess.direct.length;i++){
				Chess c=null;
				if(logger) System.out.print("    方向:"+i);
				if(chess.direct[i]==0  && chess.visited[i]==0 ){//有空白,没有访问过,可以访问 direct是方向,visited是否访问
					c=getNextChessBydirect(chess,i);
					if(! mapChess[c.iIndex][c.jIndex]){
						chess.visited[i]=1;
						c.preChess=chess;
						mapChess[chess.iIndex][chess.jIndex]=true;
						if(logger) System.out.println("可以访问,访问 "+c.iIndex+","+c.jIndex);
					}else{
						if(logger) System.out.println("不可以访问, "+c.iIndex+","+c.jIndex+" 以前访问过了");
						c=null;
					}
					
					
				}else{
					if(logger) System.out.println("不可以访问");
				}
				if((i==7) && (chess.direct[i]!=0 || chess.visited[i]==1) ){//到最后一个节点了
					//不是空白,或者已经访问过了,次节点不通
					mapChess[chess.iIndex][chess.jIndex]=false;
					
					c=chess.preChess;
					if(logger) System.out.println("所有节点都不可以访问了,需要退回到 "+c.iIndex+","+c.jIndex);
				}
				if(c!=null){
					process(c,size);
				}
				if(workout){
					break;
				}
			}
		}
			
		
	}



	/**
	 * 将二位数组生成二位对象数组
	 * @param inputArray
	 * @return
	 */
	private static Chess[][] generateChessArray(int[][] inputArray) {
		int size=inputArray.length;
		Chess[][] chessArray=new Chess[size][size];
		for(int i=0;i<size;i++){
			for(int j=0;j<size;j++){
				Chess chess=new Chess();
				chess.iIndex=i;
				chess.jIndex=j;
				if(j==0){//最左边
					chess.direct[3]=-1;
					chess.direct[4]=-1;
					chess.direct[5]=-1;
				}else if(j== (size-1)){//到最右边了
					chess.direct[0]=-1;
					chess.direct[1]=-1;
					chess.direct[7]=-1;
				}
				if(i==0){//最上面
					chess.direct[5]=-1;
					chess.direct[6]=-1;
					chess.direct[7]=-1;
				}else if(i==(size-1)){//最下面
					chess.direct[1]=-1;
					chess.direct[2]=-1;
					chess.direct[3]=-1;
				}
				
				{
					if(chess.direct[0]!=-1 && inputArray[i][j+1]==1){//右侧有棋子
						chess.direct[0]=1;
					}
					if(chess.direct[1]!=-1 && inputArray[i+1][j+1]==1){//右下侧有棋子
						chess.direct[1]=1;
					}
					if(chess.direct[2]!=-1 && inputArray[i+1][j]==1){//下侧有棋子
						chess.direct[2]=1;
					}
					if(chess.direct[3]!=-1 && inputArray[i+1][j-1]==1){//左下侧有棋子
						chess.direct[3]=1;
					}
					if(chess.direct[4]!=-1 && inputArray[i][j-1]==1){//左侧有棋子
						chess.direct[4]=1;
					}
					if(chess.direct[5]!=-1 && inputArray[i-1][j-1]==1){//左上侧有棋子
						chess.direct[5]=1;
					}
					if(chess.direct[6]!=-1 && inputArray[i-1][j]==1){//上侧有棋子
						chess.direct[6]=1;
					}
					if(chess.direct[7]!=-1 && inputArray[i-1][j+1]==1){//右上侧有棋子
						chess.direct[7]=1;
					}
					
				}
				
				chessArray[i][j]=chess;
			}
		}
		
		return chessArray;
	}
	
	public static Chess getNextChessBydirect(Chess chess,int d){//右边0,  右下1,下2,左下3,  左4,  左上5,上6,右上7    空白存储0,有子存储1,边界外存储-1
		
		if(d==0){
			return chessArray[chess.iIndex][chess.jIndex+1];
		}else if(d==1){
			return chessArray[chess.iIndex+1][chess.jIndex+1];
		}
		else if(d==2){
			return chessArray[chess.iIndex+1][chess.jIndex];
		}
		else if(d==3){
			return chessArray[chess.iIndex+1][chess.jIndex-1];
		}
		else if(d==4){
			return chessArray[chess.iIndex][chess.jIndex-1];
		}
		else if(d==5){
			return chessArray[chess.iIndex-1][chess.jIndex-1];
		}
		else if(d==6){
			return chessArray[chess.iIndex-1][chess.jIndex];
		}
		else if(d==7){
			return chessArray[chess.iIndex-1][chess.jIndex+1];
		}else{
			return null;
		}
	}

	
	

}
class Chess{
	int iIndex;
	int jIndex;
	int direct[] =new int[8];//右边0,  右下1,下2,左下3,  左4,  左上5,上6,右上7    空白存储0,有子存储1,边界外存储-1
	int visited[]=new int[8];//没有访问过是 0,访问过但没有通过是 1
	
	public Chess preChess;//前一个节点
	public Chess linkChess;//当前要访问的节点
	
	
	
	public String getChessStatus(){
		
		StringBuffer sb=new StringBuffer();
		
		if(direct[0]==1) {//右侧有棋子
			sb.append("右侧有棋子 ");
		}
		if(direct[1]==1 ){//右下侧有棋子
			sb.append("右下侧有棋子 ");
		}
		if(direct[2]==1 ){//下侧有棋子
			sb.append("下侧有棋子 ");
		}
		if(direct[3]==1 ){//左下侧有棋子
			sb.append("左下侧有棋子 ");
		}
		if(direct[4]==1 ){//左侧有棋子
			sb.append("左侧有棋子 ");
		}
		if(direct[5]==1 ){//左上侧有棋子
			sb.append("左上侧有棋子 ");
		}
		if(direct[6]==1 ){//上侧有棋子
			sb.append("上侧有棋子 ");
		}
		if(direct[7]==1 ){//右上侧有棋子
			sb.append("右上侧有棋子 ");
		}
		
		if(direct[0]==0) {//右侧有空白
			sb.append("右侧有空白 ");
		}
		if(direct[1]==0 ){//右下侧有空白
			sb.append("右下侧有空白 ");
		}
		if(direct[2]==0 ){//下侧有空白
			sb.append("下侧有空白 ");
		}
		if(direct[3]==0 ){//左下侧有空白
			sb.append("左下侧有空白 ");
		}
		if(direct[4]==0 ){//左侧有空白
			sb.append("左侧有空白 ");
		}
		if(direct[5]==0 ){//左上侧有棋子
			sb.append("左上侧有空白 ");
		}
		if(direct[6]==0 ){//上侧有空白
			sb.append("上侧有空白 ");
		}
		if(direct[7]==0 ){//右上侧有棋子
			sb.append("右上侧有空白 ");
		}
		return sb.toString();
	}
	
	
}

分享到:
评论

相关推荐

    java 迷宫 随机生成 自动寻找路径 用到树的深度遍历

    在这个项目中,我们将深入探讨如何使用Java来实现一个迷宫的随机生成以及自动寻找路径的方法,同时会涉及树的深度遍历这一核心算法。 首先,迷宫生成通常采用的是深度优先搜索(DFS,Depth-First Search)或广度...

    游戏里的智能 _寻找路径

    在游戏开发中,智能角色的行为往往需要通过复杂的算法来实现,特别是寻找路径这一核心功能。在游戏场景中,角色如何从起点有效地移动到目标点,是游戏体验的关键部分。本主题将深入探讨“游戏里的智能——寻找路径”...

    C++自定义寻找路径迷宫

    在本项目中,"C++自定义寻找路径迷宫"是一个使用C++编程语言实现的程序,它允许用户创建自定义迷宫,并自动找到从起点到终点的最短路径。这个程序结合了数据结构和算法的知识,特别是图论中的路径搜索算法。下面将...

    自动寻找路径算法

    一个可以模拟两点寻找最短路径的算法,动态显示出算法。

    寻找路径算法示例、广义优先遍历

    在本文中,我们将深入探讨“寻找路径”这一主题,并特别关注一种名为“广义优先遍历”(Generalized Breadth-First Search, GBFS)的算法。这个算法在解决寻路问题时具有广泛的应用。 首先,让我们了解“寻找路径”...

    易语言寻找路径源码.rar

    在“易语言寻找路径源码.rar”这个压缩包中,我们很显然关注的是一个关于易语言的程序源代码,具体是关于路径查找功能的实现。 在计算机编程中,路径查找通常是指定位文件或目录在文件系统中的位置。易语言提供了...

    迷宫搜寻算法C++数组中寻找路径

    宽度优先搜索(BFS)是寻找从起点到终点最短路径的理想选择,因为它总是先探索离起点近的节点。在C++中,BFS通常通过队列数据结构来实现。首先,将起点放入队列,并标记为已访问。然后,每次从队列头部取出一个节点...

    易语言源码易语言寻找路径源码.rar

    易语言源码易语言寻找路径源码.rar 易语言源码易语言寻找路径源码.rar 易语言源码易语言寻找路径源码.rar 易语言源码易语言寻找路径源码.rar 易语言源码易语言寻找路径源码.rar 易语言源码易语言寻找路径源码....

    易语言寻找路径

    "寻找路径"是计算机科学中的一个经典问题,通常涉及到图论和算法设计。在易语言中实现这个功能,我们可以探讨以下几个关键知识点: 1. **路径的概念**:在计算机科学中,路径通常指的是从一个节点(或位置)到另一...

    使用递归函数在矩阵中寻找路径

    在这个场景中,我们采用了一种称为“回溯法”的策略,配合递归函数来找到从起点到终点的有效路径。本文将深入探讨回溯法的概念,递归函数的应用,以及如何将两者结合解决迷宫问题。 首先,理解回溯法是关键。回溯法...

    迷宫寻找路径(图的遍历)源程序

    《迷宫寻找路径:图的遍历与链栈的应用》 在计算机科学中,迷宫寻路问题是一个经典的算法挑战,它涉及到图的遍历这一重要概念。本程序旨在通过图的遍历策略来解决一个二维迷宫中的路径寻找问题。在实际应用中,这种...

    java迷宫自动生成与寻找路径

    java迷宫自动生成与寻找路径。 可以设置迷宫大小,最大为50,最小为5。 按make为自动绘制迷宫,find为寻找路径。 使用递归、随机方向的方式生成迷宫,位操作来设置上下左右的墙。 文件包括源码与jar运行程序。

    迷宫中寻找路径的演示程序

    这个“迷宫中寻找路径的演示程序”很可能是一个基于VB(Visual Basic)编程语言编写的源码示例,用于帮助开发者理解和实现这样的算法。VB是微软推出的一种面向对象的编程语言,适合初学者和专业开发者进行桌面应用...

    C++用堆栈储存迷宫,并寻找路径

    ### C++ 使用堆栈储存迷宫并寻找路径 在本篇文档中,我们将详细解析一个使用堆栈数据结构来储存迷宫布局,并寻找从起点到终点路径的C++程序。该程序通过定义堆栈类、节点类以及迷宫类来实现迷宫的存储和路径寻找...

    寻找路径的方法,不同类型

    寻找路径的方法,根据不同的生成元可以选择不同的路径

    论文研究-游戏中寻找路径的改进算法.pdf

    根据提供的文件信息,以下是关于“游戏中寻找路径的改进算法”的知识点梳理: 1. A*算法概述 A*算法是一种在图形平面上,有多个节点的路径中,寻找最低通过成本的路径的算法。它广泛应用于游戏开发中,用于角色寻路...

    GPS寻找最短路径程序

    鉴于要实现以上功能其核心的操作应是如何寻找出两城市之间的最短路径,可以采用改进的单源点寻找路径方法,即Dijkstra算法,并用邻接矩阵来存储地图,鉴于会有加入新城市的功能所以需要将初始的网络图设计的大一些,...

    并查集生成迷宫及A*算法自动寻找路径

    并查集生成迷宫及A*算法自动寻找路径,学习算法的时候可以借鉴一下,很简单但是很实用。资源为整套源码。欢迎联系交流,共同学习。

    matlab开发-寻找最佳路径

    在寻找路径问题中,每个状态代表当前位置和可能的下一步,动态规划通过对所有可能路径的成本进行计算,找到成本最低的路径。 2. **创建状态转移成本矩阵**:`createTransitionCostMat.m` 文件很可能是实现这个功能...

Global site tag (gtag.js) - Google Analytics