代码如下
#include <bits/stdc++.h>
using namespace std;
int a[1005][1005], minx = 1e9, n, m, sum[1005][1005], type[1005][1005];
bool l[1005][1005], b;
struct node
{
int x, y;
};
void bfs()
{
queue <node> Q;
Q.push( {1, 1} );
l[1][1] = 1;
while( !Q.empty() )
{
node tmp = Q.front();
Q.pop();
if( tmp.x == n && tmp.y == m )
{
cout << sum[n][m];
return ;
}
int xn = tmp.x + a[tmp.x][tmp.y], yn = tmp.y + a[tmp.x][tmp.y];
int xx = tmp.x - a[tmp.x][tmp.y], yy = tmp.y - a[tmp.x][tmp.y];
if( 1 != type[tmp.x][tmp.y] && xn <= n && tmp.y <= m && xn >= 1 && tmp.y >= 1 && !l[xn][tmp.y] )
{
Q.push( { xn, tmp.y } );
sum[xn][tmp.y] = sum[tmp.x][tmp.y] + 1;
type[xn][tmp.y] = 1;
l[xn][tmp.y] = 1;
}
if( 2 != type[tmp.x][tmp.y] && xx <= n && tmp.y <= m && xx >= 1 && tmp.y >= 1 && !l[xx][tmp.y] )
{
Q.push( { xx, tmp.y } );
sum[xx][tmp.y] = sum[tmp.x][tmp.y] + 1;
type[xx][tmp.y] = 2;
l[xx][tmp.y] = 1;
}
if( 3 != type[tmp.x][tmp.y] && tmp.x <= n && yn <= m && tmp.x >= 1 && yn >= 1 && !l[tmp.x][yn] )
{
Q.push( { tmp.x,yn } );
sum[tmp.x][yn] = sum[tmp.x][tmp.y] + 1;
type[tmp.x][yn] = 3;
l[tmp.x][yn] = 1;
}
if( 4 != type[tmp.x][tmp.y] && tmp.x <= n && yy <= m && tmp.x >= 1 && yy >= 1 && !l[tmp.x][yy] )
{
Q.push( { tmp.x, yy } );
sum[tmp.x][yy] = sum[tmp.x][tmp.y] + 1;
type[tmp.x][yy] = 4;
l[tmp.x][yy] = 1;
}
if( 5 != type[tmp.x][tmp.y] && xn <= n && yn <= m && xn >= 1 && yn >= 1 && !l[xn][yn] )
{
Q.push( { xn, yn } );
sum[xn][yn] = sum[tmp.x][tmp.y] + 1;
type[xn][yn] = 5;
l[xn][yn] = 1;
}
if( 6 != type[tmp.x][tmp.y] && xn <= n && yy <= m && xn >= 1 && yy >= 1 || !l[xn][yy] )
{
Q.push( { xn, yy } );
sum[xn][yy] = sum[tmp.x][tmp.y] + 1;
type[xn][yy] = 6;
l[xn][yy] = 1;
}
if( 7 != type[tmp.x][tmp.y] && xx <= n && yn <= m && xx >= 1 && yn >= 1 && !l[xx][yn] )
{
Q.push( { xx, yn } );
sum[xx][yn] = sum[tmp.x][tmp.y] + 1;
type[xx][yn] = 7;
l[xx][yn] = 1;
}
if( 8 != type[tmp.x][tmp.y] && xx <= n && yy <= m && xx >= 1 && yy >= 1 && !l[xx][yy] )
{
Q.push( { xx, yy } );
sum[xx][yy] = sum[tmp.x][tmp.y] + 1;
type[xx][yy] = 8;
l[xx][yy] = 1;
}
}
cout << "NEVER";
}
int main()
{
cin >> n >> m;
for( int i = 1; i <= n; i ++ )
{
for( int j = 1; j <= m; j ++ ) cin >> a[i][j];
}
bfs();
}