

题解:
给你一个矩阵,里面都是1/0的数字,再给你两个坐标,一个为出发点,一个为终点。我们的目的是要从出发点到终点。
但是题目有些限制:1,在为1的数字上面只能左右走,在0的数字上是只能上下走
2,每走一步所有的数字都会变化,即0->1 , 1->0
3, 不能停
这样的需要宽搜就行了,宽搜加一个当前的步数,每次走,自己的都会变,图就不用变了。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Node {
int x,y,step;
Node(int x = 0,int y = 0,int step = -1):x(x),y(y),step(step){}
};
int dir[4][2]{
{0,1},
{0,-1},
{-1,0},
{1,0},
};
int main()
{
ios::sync_with_stdio(false);
int T;
cin >> T;
while (T --){
int n,m;
cin >> n >> m;
int pic[n+2][m+2];
int vis[n+2][m+2];
memset(vis,0,sizeof(vis));
for (int i = 1;i <= n;i ++){
for (int j = 1;j <= m;j ++){
cin >> pic[i][j];
}
}
Node s,e;
cin >> s.x >> s.y >> e.x >> e.y;
s.step = 0;
vis[s.x][s.y] = 1;
//jia
//cout << s.x << ',' << s.y << ',' << s.step << endl;
queue<Node> qu;
qu.push(s);
int flag = 0;
while (!qu.empty()){
Node k = qu.front();
qu.pop();
int in = k.step&1;
if (k.x == e.x && k.y == e.y){
flag = 1;
e = k;
break;
}
//jia
//cout << k.x << ',' << k.y << ',' << k.step << endl;
// 1
if (in == 1 && pic[k.x][k.y] == 0 || in == 0 && pic[k.x][k.y] == 1){
for (int i = 0;i < 2;i ++){
int dx = k.x + dir[i][0];
int dy = k.y + dir[i][1];
if (vis[dx][dy] || dx < 1 || dx > n || dy < 1 || dy > m)continue;
vis[dx][dy] = 1;
qu.push(Node(dx,dy,k.step+1));
// jia
//cout << dx << ',' << dy << ',' << k.step+1 << endl;
}
}
// 0
if (in == 0 && pic[k.x][k.y] == 0 || in == 1 && pic[k.x][k.y] == 1){
for (int i = 2;i < 4;i ++){
int dx = k.x + dir[i][0];
int dy = k.y + dir[i][1];
if (vis[dx][dy] || dx < 1 || dx > n || dy < 1 || dy > m)continue;
vis[dx][dy] = 1;
qu.push(Node(dx,dy,k.step+1));
// jia
//cout << dx << ',' << dy << ',' << k.step+1 << endl;
}
}
}
if (flag) cout << e.step << endl;
else cout << -1 << endl;
}
}