又是手爆炸的一天........

#include <bits/stdc++.h>
using namespace std;
int m,n,x,y,c,g[101][101],ans[101][101],dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}},vis[101][101];
queue<pair<int,int>>q;
void bfs(int x,int y){
    q.push({x,y});
    ans[x][y]=0;
    while(!q.empty()){
        pair<int,int>t=q.front();
        q.pop();
        for(int i=0;i<4;i++){
            int nx=t.first+dir[i][0],ny=t.second+dir[i][1];
            if(nx<1||ny<1||nx>m||ny>m)continue;
            if(g[nx][ny]==-1&&g[t.first][t.second]==-1)continue;
            if(ans[nx][ny]<ans[t.first][t.second]+2)continue;
            if(g[nx][ny]==-1&&g[t.first][t.second]!=-1){
                ans[nx][ny]=min(ans[t.first][t.second]+2,ans[nx][ny]);
                vis[nx][ny]=g[t.first][t.second];
                q.push(make_pair(nx,ny));
            }
            if(g[nx][ny]!=-1&&g[t.first][t.second]==-1){
                if(g[nx][ny]==vis[t.first][t.second])
                    ans[nx][ny]=min(ans[t.first][t.second],ans[nx][ny]);
                else ans[nx][ny]=min(ans[t.first][t.second]+1,ans[nx][ny]);
                q.push(make_pair(nx,ny));
            }
            if(g[nx][ny]==0&&g[t.first][t.second]==0){
                ans[nx][ny]=min(ans[t.first][t.second],ans[nx][ny]);
                q.push(make_pair(nx,ny));
            }
            if(g[nx][ny]==1&&g[t.first][t.second]==1){
                ans[nx][ny]=min(ans[t.first][t.second],ans[nx][ny]);
                q.push(make_pair(nx,ny));
            }
            if(g[nx][ny]==1&&g[t.first][t.second]==0){
                ans[nx][ny]=min(ans[t.first][t.second]+1,ans[nx][ny]);
                q.push(make_pair(nx,ny));
            }
            if(g[nx][ny]==0&&g[t.first][t.second]==1){
                ans[nx][ny]=min(ans[t.first][t.second]+1,ans[nx][ny]);
                q.push(make_pair(nx,ny));
            }
        }
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin>>m>>n;
    memset(g,-1,sizeof g);
    memset(ans,0x3f,sizeof ans);
    memset(vis,-1,sizeof vis);
    for(int i=0;i<n;i++){
        cin>>x>>y>>c;
        g[x][y]=c;
    }
    bfs(1,1);
    if(ans[m][m]==0x3f3f3f3f)cout<<-1;
    else cout<<ans[m][m];
    return 0;
}

0 条评论

目前还没有评论...

信息

ID
1512
难度
7
分类
(无)
标签
递交数
62
已通过
12
通过率
19%
被复制
7
上传者