#3WA求调
查看原帖
#3WA求调
802557
pyiming楼主2024/3/15 22:34

wrong answer 373rd numbers differ - expected: '8', found: '-1'

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e3,INF=1e18;
bool s[N+1][N+1];
ll f[N+1][N+1];
int main(){
    // freopen("data.in","r",stdin);
    // freopen("data.out","w",stdout);
    int T;
    scanf("%d",&T);
    while(T--){
        ll n,m;
        scanf("%lld%lld",&n,&m);
        for(ll i=1;i<=n;i++){
            for(ll j=1;j<=m;j++){
                scanf("%d",&s[j][i]);
            }
        }
        for(ll i=0;i<=m;i++){
            for(ll j=1;j<=n;j++){
                f[i][j]=INF;//初始化
            }
        }
        f[1][1]=0;
        for(ll i=1;i<=m;i++){
            if(!s[i][1]&&!s[i-1][n]){
                f[i][1]=min(f[i][1],f[i-1][n]+1);
            }
            for(ll j=2;j<=n;j++) if(!s[i][j]){
                f[i][j]=min(f[i][j],f[i-1][j-1]+1);
            }
            if(!s[i][1]&&!s[i][n]&&!s[i][n-1]){
                f[i][1]=min(f[i][1],f[i][n-1]+1);
            }
            if(!s[i][2]&&!s[i][1]&&!s[i][n]){
                f[i][2]=min(f[i][2],f[i][n]+1);
            }
            for(ll j=3;j<=n;j++) if(!s[i][j]&&!s[i][j-1]&&!s[i][j-2]){
                f[i][j]=min(f[i][j],f[i][j-2]+1);
            }
            if(!s[i][1]&&!s[i][n]&&!s[i][n-1]){
                f[i][1]=min(f[i][1],f[i][n-1]+1);
            }
            if(!s[i][2]&&!s[i][1]&&!s[i][n]){
                f[i][2]=min(f[i][2],f[i][n]+1);
            }
            for(ll j=3;j<=n;j++) if(!s[i][j]&&!s[i][j-1]&&!s[i][j-2]){
                f[i][j]=min(f[i][j],f[i][j-2]+1);
            }
            // for(ll j=1;j<=n;j++){
            //     cout<<f[i][j]<<" ";
            // }
            // cout<<endl;
        }
        // for(ll i=1;i<=n;i++){
        //     cout<<f[m][i]<<" ";
        // }
        // cout<<endl;
        bool flag=0;
        for(ll i=1;i<=n;i++){
            if(f[m][i]<INF){
                flag=1;
                break;
            }   
        }
        if(!flag){
            printf("-1\n");
            continue;
        }
        ll ans=INF;
        for(ll i=1;i<=n;i++){
            ll t=((i-f[m][i]-1)%n+n)%n+1;
            ans=min(ans,min(t,n-t)+f[m][i]);
            if(ans==1630){
                cout<<endl;
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}
2024/3/15 22:34
加载中...