先附上题目截图
这个题目与经典的迷宫问题差别的难点在于对数组的赋值建立,和找到输入的数值所处的位置,这两个解决了之后,用经典的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