求佬看看记忆化搜
查看原帖
求佬看看记忆化搜
784813
SakurajiamaMai楼主2024/5/9 15:43

rt,为什么这样搜不对QAQ,只有65

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10,mod=1e9+7;
int mp[105][105],dp[105][105][2];
int dx[]={1,-1,0,0},dy[]={0,0,1,-1};
int n,m;
bool vis[105][105][2];
int dfs(int x,int y,int now,bool ok){
    if(x==n&&y==n) return 0;
    if(vis[x][y][now]) return dp[x][y][now];
    vis[x][y][now]=true;
    for(int i=0;i<4;i++){
        int xx=x+dx[i],yy=y+dy[i];
        if(xx<1||xx>n||yy<1||yy>n) continue;
        if(mp[xx][yy]==-1){
            if(ok) continue;
            dp[x][y][now]=min(dp[x][y][now],dfs(xx,yy,now,true)+2);
        }
        else if(mp[xx][yy]!=-1&&mp[xx][yy]!=now) dp[x][y][now]=min(dp[x][y][now],dfs(xx,yy,mp[xx][yy],false)+1);
        else dp[x][y][now]=min(dp[x][y][now],dfs(xx,yy,now,false)); 
    }
    if(dp[x][y][now]>=1e18) vis[x][y][now]=false;
    return dp[x][y][now];
}
signed main()
{
    std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    cin>>n>>m;
    memset(mp,-1,sizeof mp);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            dp[i][j][0]=dp[i][j][1]=1e18;
    for(int i=1;i<=m;i++){
        int a,b,c; cin>>a>>b>>c;    
        mp[a][b]=c;
    }
    int res=dfs(1,1,mp[1][1],false);
    if(res>=1e18) cout<<-1<<'\n';
    else cout<<res<<'\n';
    return 0;
}
2024/5/9 15:43
加载中...