java迷宫问题——移动距离(第六届蓝桥杯真题)

先附上题目截图

在这里插入图片描述
这个题目与经典的迷宫问题差别的难点在于对数组的赋值建立,和找到输入的数值所处的位置,这两个解决了之后,用经典的dfs算法去算出最短距离即可。

第一步:建立特殊的数组:

		w = in.nextInt();
//		n = in.nextInt();
		int num=1;
		for(int i=1;i<=10;i++) {
    
    
			if((i&1)==1) {
    
          //判断是否是奇数行
				for(int j=1;j<=w;j++)
			a[i][j]=num++;     //顺序赋值
			}
			else {
    
    
				for(int j=w;j>0;j--)  //逆序赋值
					a[i][j]=num++;  
			}
		}

第二步:赋值完之后输入m,n两个数,通过遍历数组找到m,n所处的行和列,也就是找到起始位置和目标位置。

		m=in.nextInt();
		n=in.nextInt();
			for(int i=0;i<10;i++) {
    
    
				for(int j=0;j<=w;j++)
				{
    
    	if(a[i][j]==m) {
    
     startx=i; starty=j;}
					if(a[i][j]==n) {
    
     p=i;q=j;}
				}
			}

然后接下来就简单多了,用一个最常用的dfs算法,算出起始位置和目标位置的距离

	public static void dfs(int x,int y,int step) {
    
    
		if(x==p && y==q)
		{
    
    
			if(step<min)
				min=step;
			return;
		}
		for(int i=0;i<4;i++) {
    
    
			int tx = x+dx[i];
			int ty = y+dy[i];
			if(tx<=minx&&ty<=w&&tx>=0&&ty>=0)
			if(v[tx][ty]==0) {
    
    
				v[tx][ty]=1;
				dfs(tx,ty,step+1);
				v[tx][ty]=0;
			}
		}
	}

因为输入不同的列数得到的数组差别很大,所以tx的范围用minx来限定
minx取的是起始位置和目标位置里面行数最大的值

		minx=Math.max(startx, p);

附上完整代码:

package six;

import java.util.Scanner;

public class text4 {
    
    
//移动距离
	static int a[][] = new int [50][50];
	static int v[][] = new int [50][50];
	static int p,q,startx,starty;
	static int min=999;
	static int w,m,n;
	static int dx[] = {
    
    0,1,0,-1};
	static int dy[] = {
    
    1,0,-1,0};
	static int minx;
	public static void dfs(int x,int y,int step) {
    
    
		if(x==p && y==q)
		{
    
    
			if(step<min)
				min=step;
			return;
		}
		for(int i=0;i<4;i++) {
    
    
			int tx = x+dx[i];
			int ty = y+dy[i];
			if(tx<=minx&&ty<=w&&tx>=0&&ty>=0)  //这里要加minx是因为简约算法的路径
			if(v[tx][ty]==0) {
    
    
				v[tx][ty]=1;
				dfs(tx,ty,step+1);
				v[tx][ty]=0;
			}
		}
	}
	public static void main(String[] args) {
    
    
		Scanner in  = new Scanner(System.in);
		w = in.nextInt();
//		n = in.nextInt();
		int num=1;
		for(int i=1;i<=10;i++) {
    
    
			if((i&1)==1) {
    
          //判断是否是奇数行
				for(int j=1;j<=w;j++)
			a[i][j]=num++;     //顺序赋值
			}
			else {
    
    
				for(int j=w;j>0;j--)  //逆序赋值
					a[i][j]=num++;  
			}
		}
//		for(int i=0;i<10;i++) {
    
    
//			for(int j=0;j<=w;j++)
//				System.out.print(a[i][j]+" ");
//			System.out.println("");
//		}
		m=in.nextInt();
		n=in.nextInt();
			for(int i=0;i<10;i++) {
    
    
				for(int j=0;j<=w;j++)
				{
    
    	if(a[i][j]==m) {
    
     startx=i; starty=j;}
					if(a[i][j]==n) {
    
     p=i;q=j;}
				}
			}
//        System.out.println(startx+" "+starty+" " +p+" "+q);
		minx=Math.max(startx, p);
        dfs(startx,starty,0);
		System.out.println(min);
	}
}

2020.12.22

猜你喜欢

转载自blog.csdn.net/weixin_44919936/article/details/109585615