题目描述
随后n行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。输出输出最少走几步。样例输入
这有一个迷宫,有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 <bits/stdc++.h>
using namespace std;
struct node
{
int x,y,step;
};
int mp[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 dir[4][2] = {{1,0},{0,-1},{-1,0},{0,1}};
bool book[9][9];
int M,N;
void bfs(node s)
{
book[s.x][s.y] = true;
queue <node> q;
q.push(s);
while(!q.empty())
{
node now = q.front();
q.pop();
for(int i = 0; i < 4; i++)
{
node next;
next.x = now.x + dir[i][0];
next.y = now.y + dir[i][1];
next.step = now.step + 1;
if(next.x >= 0 && next.y >= 0 && next.x < 9 && next.y < 9
&& book[next.x][next.y] == false && mp[next.x][next.y] == 0)
{
if(next.x == M && next.y == N)
{
cout<<next.step<<endl;
return ;
}
book[next.x][next.y] = true;
q.push(next);
}
}
}
cout<<"0"<<endl;
}
int main()
{
node s;
int t;
cin>>t;
while(t--)
{
memset(book,0,sizeof(book));
cin>>s.x>>s.y>>M>>N;
s.step = 0;
bfs(s);
}
}