救救吧,#2不是TLE就是MLE

P1434 [SHOI2002] 滑雪

wwsz_cn @ 2020-01-07 16:41:30

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int x,y,d;
};
int r,c;
int m[101][101];
queue<node> dl;
int fx1[4]={1,-1,0,0};
int fx2[4]={0,0,1,-1};
bool walk[101][101]; 
void read(int &a)
{
    a=0;int d=1;char c;
    while(c=getchar(),c<'0'||c>'9')if(c=='-')d=-1;a=a*10+c-48;
    while(c=getchar(),c>='0'&&c<='9')a=a*10+c-48;
    a*=d;
    return ;
}
void write(int x)
{
    if(x<0){x=-x;putchar(45);}
    if(x)write(x/10);
    else return;
    putchar(x%10+48);
    return;
}
void clear()
{
    queue<node> empty;
    swap(dl,empty);
    return;
}
int maxn=-1;
void bfs(int x,int y)
{
    dl.push((node){x,y,1});
    while(!dl.empty())
    {
        node a=dl.front();
        dl.pop();
        int f=0;
        for(int i=0;i<4;i++)
        {
            int nx=a.x+fx1[i],ny=a.y+fx2[i];
            if(nx>=1&&nx<=r&&ny>=1&&ny<=c&&m[nx][ny]<m[a.x][a.y]) 
                dl.push((node){nx,ny,a.d+1}),walk[nx][ny]=1;
            else f++;
        }
        if(f==4)
            maxn=max(maxn,a.d);
    }
}
int main()
{
    read(r),read(c); 
    for(int i=1;i<=r;i++)
        for(int j=1;j<=c;j++)
            read(m[i][j]);
    for(int i=r;i>=1;i--)
        for(int j=c;j>=1;j--)
            if(!walk[i][j])
                clear(),bfs(i,j);
    write(maxn);
    return 0;
}

|