求助(悬关)
查看原帖
求助(悬关)
1032960
Danny_chan楼主2024/4/18 20:03

求助各位大佬,80分。

代码:

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int n,m;
char a[60][60];
int s[60][60],s1[60][60];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
queue<pair<int,int>>q;
queue<pair<int,int>>q1;
int f1,f2,f3,f4,f5,f6;
void bfs(int x,int y){
	memset(s,-1,sizeof s);
	q.push({x,y});
	s[x][y]=0;
	while(!q.empty()){
		auto t=q.front();
		q.pop();
		for(int i=0;i<4;i++){
			int x1=t.first+dx[i];
			int y1=t.second+dy[i];
			if(x1<=0||x1>n||y1<=0||y1>m) continue;
			if(a[x1][y1]=='X'||a[x1][y1]=='D') continue;
			if(s[x1][y1]>=0) continue;
			s[x1][y1]=s[t.first][t.second]+1;
			q.push({x1,y1});
		}
	}
}
void bfs_1(int x,int y){
	memset(s1,-1,sizeof s1);
	q1.push({x,y});
	s1[x][y]=0;
	while(!q1.empty()){
		auto t=q1.front();
		q1.pop();
		
		for(int i=0;i<4;i++){
			int x1=t.first+dx[i];
			int y1=t.second+dy[i];
			if(x1<=0||x1>n||y1<=0||y1>m) continue;
			if(a[x1][y1]=='X') continue;
			if(s1[t.first][t.second]+1>=s[x1][y1]&&s[x1][y1]!=-1) continue;
			if(s1[x1][y1]>=0) continue;
			s1[x1][y1]=s1[t.first][t.second]+1;
			if(x1==f3&&y1==f4){
				cout<<s1[x1][y1];
				return ;
			}
			q1.push({x1,y1});
		}
	}
	cout<<"KAKTUS";
	return ;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
			if(a[i][j]=='*'){
				f1=i;
				f2=j;
			}
			if(a[i][j]=='D'){
				f3=i;
				f4=j;
			}
			if(a[i][j]=='S'){
				f5=i;
				f6=j;
			}
		}
	}
	bfs(f1,f2);
	bfs_1(f5,f6);
	return 0;
} 
2024/4/18 20:03
加载中...