- 棋盘
- 2024-07-25 16:31:56 @
#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
- 分类
- (无)
- 标签
- 递交数
- 61
- 已通过
- 11
- 通过率
- 18%
- 被复制
- 7
- 上传者