最少步数
-
描述
-
这有一个迷宫,有0~8行和0~8列:
1,1,1,1,1,1,1,1,1
1,0,0,1,0,0,1,0,1
1,0,0,1,1,0,0,0,1
1,0,1,0,1,1,0,1,1
1,0,0,0,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,0,0,0,1
1,1,1,1,1,1,1,1,10表示道路,1表示墙。
现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从起点到达终点?
(注:一步是指从一坐标点走到其上下左右相邻坐标点,如:从(3,1)到(4,1)。)
-
输入
-
第一行输入一个整数n(0<n<=100),表示有n组测试数据;
随后n行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。
输出
- 输出最少走几步。 样例输入
-
2 3 1 5 7 3 1 6 7
样例输出
-
12 11
来源
- [苗栋栋]原创 上传者
#include<iostream>
using namespace std;
int minsteps=100;
int maze[9][9]={{1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,1,0,1},
{1,0,0,1,1,0,0,0,1},
{1,0,1,0,1,1,0,1,1},
{1,0,0,0,0,1,0,0,1},
{1,1,0,1,0,1,0,0,1},
{1,1,0,1,0,1,0,0,1},
{1,1,0,1,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1},
};
int min(int a,int b)
{
return a<b?a:b;
}
void visit(int i,int j,int endI,int endJ,int step)
{
maze[i][j]=2;
if(i==endI&&j==endJ)
minsteps=min(minsteps,step);
if(maze[i][j+1]==0) visit(i,j+1,endI,endJ,step+1);//走一步就+1
if(maze[i][j-1]==0) visit(i,j-1,endI,endJ,step+1);
if(maze[i+1][j]==0) visit(i+1,j,endI,endJ,step+1);
if(maze[i-1][j]==0) visit(i-1,j,endI,endJ,step+1);
maze[i][j]=0;
step--; //不符合条件就-1
}
int main()
{
int startI,startJ,endI,endJ;
int n,a,b,c,d;
cin>>n;
while(n--)
{
int count[1000],i,j,step=0;
cin>>a>>b>>c>>d;
startI=a,startJ=b,endI=c,endJ=d;
visit(a,b,c,d,step);
cout<<minsteps<<endl;
minsteps=999; //这步很关键,因为minsteps是全局变量,值会保留,所以每次都要修改。
}
return 0;
}
-
第一行输入一个整数n(0<n<=100),表示有n组测试数据;