求助十分
查看原帖
求助十分
505983
流光剑客楼主2022/7/27 14:16
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
int m,n,x[1005],y[1005],c[1005],d[1005][1005];
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
ll minn=inf;
bool f[1005][1005],flag=false;
inline void dfs(int r,int c,ll ans,int k){
    if(r==m&&c==m){
        minn=min(ans,minn);
        return;
    }
    for(int i=0;i<4;i++){
        int nr=dx[i]+r;
        int nc=dy[i]+c;
        if(1<=nr&&nr<=m&&1<=nc&&nc<=m&&!f[nr][nc]
        &&(d[nr][nc]==1||d[nr][nc]==2)){
            f[nr][nc]=true;
            flag=false;
            if(d[r][c]==0||d[nr][nc]==d[r][c])dfs(nr,nc,ans,k);
            else dfs(nr,nc,ans+1,k);
            f[nr][nc]=false;
        }else if(flag==false&&d[nr][nc]==0){
            k++;
            f[nr][nc]=true;
            flag=true;
            dfs(nr,nc,ans+2,k);
            f[nr][nc]=false;
        }
    }
}
int main(){
    scanf("%d%d",&m,&n);
    for(int i=1;i<=n;i++){
        scanf("%d%d%d",&x[i],&y[i],&c[i]);
        if(c[i]==1)d[x[i]][y[i]]=1;
        else if(c[i]==0)d[x[i]][y[i]]=2;
    }
    f[1][1]=true;
    dfs(1,1,0,0);
    if(minn>=1&&minn!=inf)printf("%lld\n",minn);
    else if(minn==inf)printf("-1\n");
    return 0;
}

2022/7/27 14:16
加载中...