1 solutions

  • 0
    @ 2025-12-3 17:21:29

    C++ :

    #include<bits/stdc++.h>
    using namespace std;
    int r,c,k,t,ans;
    float bj=1.0;//标记第一次垂直下降开始的行号 
    char a[55][55];
    void find(int x,int y)
    {
        if(x==r) {cout<<ans;exit(0);}
        if(a[x+1][y]=='.') find(x+1,y);
        else
            for(int i=y+1,j=y-1;;i++,j--) //左右找哪一列可以下降 
            {
                if(a[x+1][i]=='.' && i<=c) {//往右找 
                    if((i*1.0-y*1.0)/(x*1.0+1-bj)>k) {cout<<-1;exit(0);}
                    // 需要移动的列数除以下降的行数>K,即平均每行下降的列数>K,则不行 
                    bj=x+1;//标记下一次垂直下降开始的行号 
                    ans+=i-y;//累加答案 
                    find(x+1,i);
                }       
                else if(a[x+1][j]=='.' && j>=1){//往左找 
                    if((y*1.0-j*1.0)/(x*1.0+1-bj)>k) {cout<<-1;exit(0);}
                    bj=x+1; 
                    ans+=y-j;
                    find(x+1,j);
                }
            }       
    }
    int main()
    {
        cin>>r>>c>>k;
        for(int i=1;i<=r;i++)
            for(int j=1;j<=c;j++)
                cin>>a[i][j];
        for(int i=1;;i++)
            if(a[1][i]=='v') {t=i;break;}
        find(1,t);  
        return 0;
    }
    
    • 1

    Information

    ID
    995
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    10
    Tags
    # Submissions
    1
    Accepted
    1
    Uploaded By