Submission

Status:

[PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP]

Subtask/Task Score:

{100/100}

Score: 100

User: nemuchannnUwU

Problemset: ย่องเบาหลบกับระเบิด

Language: cpp

Time: 0.050 second

Submitted On: 2026-10-06 19:07:23

#include<bits/stdc++.h>
using namespace std;
int dx[]={1,-1,0,0,-1,1,1,-1};
int dy[]={0,0,1,-1,1,1,-1,-1};

int _canx[]={0,0,1,-1};
int _cany[]={-1,1,0,0};
bool chk(int x,int y,int n,int m){
	return (x>=0&&x<n&&y>=0&&y<m);
}

int main(){
	cin.tie(nullptr)->sync_with_stdio(0);
	int n,m; cin >> n >> m;
	int mn=INT_MAX;
	vector<vector<int>> grid(n,vector<int>(m));
	for (int i=0;i<n;i++){
		for (int j=0;j<m;j++){
			cin >> grid[i][j];
		}
	}
	vector<vector<int>> block=grid;
	for (int i=0;i<n;i++){
		for (int j=0;j<m;j++){
			if (grid[i][j]==0){
				for (int k=0;k<8;k++){
					int nx=i+dx[k];
					int ny=j+dy[k];
					if (chk(nx,ny,n,m)){
						block[nx][ny]=0;
					}
				}
			}
		}
	}
	vector<vector<bool>> visited(n,vector<bool> (m,false));
	queue<tuple<int,int,int>> q;
	for (int i=0;i<n;i++){
		if (block[i][0]==0) continue;
		q.push({i,0,1});
		visited[i][0]=true;
	}
	
	while(!q.empty()){
		auto [x,y,dist]=q.front();
		q.pop();
	
		if (y==m-1){
			mn=min(dist,mn);
			break;
		}
		for (int j=0;j<4;j++){
			int nx=x+dx[j];
			int ny=y+dy[j];
			if (chk(nx,ny,n,m)&&!visited[nx][ny]&&block[nx][ny]!=0){
				visited[nx][ny]=true;
				q.push({nx,ny,dist+1});	
			}
		}
	}
	if (mn==INT_MAX) cout << "-1";
	else cout << mn;
	
}