算法:搜索(深度优先搜索)
描述
这有一个迷宫,有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,1
0表示道路,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>
#include <string>
#include <cstring>
#include <iomanip>
#define INF 1000000
using namespace std;
int a[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 b[8][8],c,d,l[4][2]={-1,0,0,-1,1,0,0,1};
void dfs(int i,int j)
{
if(i==c&&j==d) return;
for(int k=0;k<4;k++)
{
int dx=i+l[k][0];
int dy=j+l[k][1];
if(dx>=0&&dx<8&&dy>=0&&dy<8&&a[dx][dy]==0)
{
a[dx][dy]=1;
if(b[i][j]+1<b[dx][dy]) b[dx][dy]=b[i][j]+1;
dfs(dx,dy);
a[dx][dy]=0;
}
}
}
int main()
{
int t,i,j,k,n,m;
cin>>t;
while(t--)
{
cin>>n>>m>>c>>d;
for(i=0;i<8;i++)
for(j=0;j<8;j++)
b[i][j]=INF;
b[n][m]=0;
dfs(n,m);
cout<<b[c][d]<<endl;
}
}