• 个人简介

    cspjcspjcspjcsp_j^{{csp_j}^{csp_j}}

    #include <bits/stdc++.h>
    using namespace std;
    const int D[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
    int n,a[1010][1010],dist[1010][1010][2];
    struct Node{
    	int x,y,z;
    };
    queue<Node> q;
    void bfs(){
    	memset(dist,127,sizeof(dist));
    	q.push({1,1,0});q.push({1,1,1});
    	dist[1][1][0]=dist[1][1][1]=1;
    	while(!q.empty()){
    		int x=q.front().x,y=q.front().y,z=q.front().z;
    		if(x==n&&y==n) break;
    		q.pop();
    		for(int i=0;i<4;i++){
    			int xx=x+D[i][0],yy=y+D[i][1];
    			if(xx<1||xx>n||yy<1||yy>n) continue;
    			if(z&&a[xx][yy]>a[x][y]&&dist[xx][yy][0]>dist[x][y][1]+1){
    				dist[xx][yy][0]=dist[x][y][1]+1;
    				q.push({xx,yy,0});
    			}else if(!z&&a[xx][yy]<a[x][y]&&dist[xx][yy][1]>dist[x][y][0]+1){
    				dist[xx][yy][1]=dist[x][y][0]+1;
    				q.push({xx,yy,1});
    			}
    		}
    	}
    	int ans=min(dist[n][n][0],dist[n][n][1]);
    	if(ans!=dist[0][0][0]) printf("%lld",ans);
    	else printf("-1");
    }
    int main(){
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&a[i][j]);
    	bfs();	
    	return 0;
    }