[ABC317E] Avoid Eye Contact WA求调(悬三关)急
查看原帖
[ABC317E] Avoid Eye Contact WA求调(悬三关)急
1011587
Winalways楼主2024/8/7 12:20

at提交记录

#include <bits/stdc++.h>
using namespace std;
const int N=1e3*2+10;
char mp[N][N];
bool vis[N][N];
int dx[4]={0,0,-1,1};
int dy[4]={-1,1,0,0},n,m;
struct State{
	int x;
	int y;
	int step;
};
int bfs(State st,int ex,int ey){
	vis[st.x][st.y]=1;
	State now,next;
	queue<State> q;
	st.step=0;
	q.push(st);
	while(!q.empty()){
		now=q.front();
		if(now.x==ex&&now.y==ey){
			return now.step;
		}
		for(int i=0;i<4;i++){
			next.x=now.x+dx[i];
			next.y=now.y+dy[i];
			if(next.x>=0&&next.x<n&&next.y>=0&&next.y<m&&vis[next.x][next.y]!=1&&mp[next.x][next.y]!='#'&&mp[next.x][next.y]!='v'&&mp[next.x][next.y]!='<'&&mp[next.x][next.y]!='>'&&mp[next.x][next.y]!='^'){
				next.step=now.step+1;
				vis[next.x][next.y]=1;
				q.push(next);
			}
		}
		q.pop();
	}
	return -1;
}
int main(){
	cin>>n>>m;
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			cin>>mp[i][j];
	}}
	State temp;
	int ex,ey;
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			if(mp[i][j]=='S')temp.x=i,temp.y=j;	
			if(mp[i][j]=='G')ex=i,ey=j;
			if(mp[i][j]=='<'){
				for(int k=j-1;k>=0;k--){
					if(mp[i][k]=='#'||mp[i][k]=='>'||mp[i][k]=='v'||mp[i][k]=='^') break;	
					mp[i][k]='#';
				}
			}
			if(mp[i][j]=='>'){
				for(int k=j+1;k<m;k++){
					if(mp[i][k]=='#'||mp[i][k]=='<'||mp[i][k]=='v'||mp[i][k]=='^') break;	
					mp[i][k]='#';
				}
			}
			if(mp[i][j]=='v'){
				for(int k=i+1;k<n;k++){
					if(mp[k][j]=='#'||mp[k][j]=='^'||mp[k][j]=='>'||mp[k][j]=='<') break;
					mp[k][j]='#';
				}
			}
			if(mp[i][j]=='^'){
				for(int k=i-1;k>=0;k--){
					if(mp[k][j]=='#'||mp[k][j]=='^'||mp[k][j]=='>'||mp[k][j]=='<') break;
					mp[k][j]='#';
				}
			}
		}
	}
	cout<<bfs(temp,ex,ey);
	return 0;
}
2024/8/7 12:20
加载中...