从给定点的坐标走到目的地,问最短步数。
输入给出m*n的矩阵,矩阵只包含0和1。
最后一行输入起始点和终止点。
0代表只能向上向下走,1代表只能向左向右走。
每走一步之后,矩阵中所有的1变为0,0变为1。
当然,在当前的坐标中不能停留,下一秒必须要走。
思路大概就是判断步数的奇偶性然后和当前步数矩阵的奇偶性做BFS。
但是输入的数据很坑,只给了 n*m<=1e5的数据量,所以开二维数组必然RE
可以用map数组模拟二维数组,也可以用vector模拟
这里用了map
另外一个很坑的是每次map清空时不要循环1e5的数据量,否则TLE
循环n的数据量就过了 100ms左右
坑!!!
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<iomanip>
#include<map>
#include<stack>
#include<vector>
#include<queue>
#include<set>
#include<utility>
#include<algorithm>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
//#define swap(a,b) (a=a+b,b=a-b,a=a-b)
#define memset(a) memset(a,0,sizeof(a))
#define X (sqrt(5)+1)/2.0 //Wythoff
#define Pi acos(-1)
#define e 2.718281828459045
#define eps 1.0e-8
using namespace std;
typedef long long int LL;
typedef pair<int,int>pa;
const int MAXL(1e5);
const int INF(0x3f3f3f3f);
const int mod(1e9+7);
int dir[4][2]= {{-1,0},{1,0},{0,1},{0,-1}};
map<int,int>a[MAXL+50];
map<int,int>flag[MAXL+50];
struct node
{
int x,y;
int step;
}nod;
int n,m;
int BFS(int xx,int yy,int e1,int e2)
{
queue<node>q;
nod.x=xx;
nod.y=yy;
nod.step=0;
q.push(nod);
while(!q.empty())
{
nod=q.front();
q.pop();
int x,y,step;
x=nod.x;
y=nod.y;
step=nod.step;
if(x==e1&&y==e2)
return step;
if(step&1)
{
if(a[x][y]&1)
{
if(x+1<=m&&!flag[x+1][y])
nod.x=x+1,nod.y=y,nod.step=step+1,q.push(nod),flag[x+1][y]=1;
if(x-1>=1&&!flag[x-1][y])
nod.x=x-1,nod.y=y,nod.step=step+1,q.push(nod),flag[x-1][y]=1;
}
else
{
if(y-1>=1&&!flag[x][y-1])
nod.x=x,nod.y=y-1,nod.step=step+1,q.push(nod),flag[x][y-1]=1;
if(y+1<=n&&!flag[x][y+1])
nod.x=x,nod.y=y+1,nod.step=step+1,q.push(nod),flag[x][y+1]=1;
}
}
else
{
if(a[x][y]&1)
{
if(y-1>=1&&!flag[x][y-1])
nod.x=x,nod.y=y-1,nod.step=step+1,q.push(nod),flag[x][y-1]=1;
if(y+1<=n&&!flag[x][y+1])
nod.x=x,nod.y=y+1,nod.step=step+1,q.push(nod),flag[x][y+1]=1;
}
else
{
if(x+1<=m&&!flag[x+1][y])
nod.x=x+1,nod.y=y,nod.step=step+1,q.push(nod),flag[x+1][y]=1;
if(x-1>=1&&!flag[x-1][y])
nod.x=x-1,nod.y=y,nod.step=step+1,q.push(nod),flag[x-1][y]=1;
}
}
}
return -1;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
int ans=BFS(x1,y1,x2,y2);
cout<<ans<<endl;
for(int i=0;i<=m;i++)
a[i].clear();
for(int i=0;i<=m;i++)
flag[i].clear();
}
}