求调
查看原帖
求调
1284088
meifan666楼主2024/9/14 22:41
#include<bits/stdc++.h>
using namespace std;
int n,m;
char a[110][110];
bool vis[110][110][5];
int sx,sy;
int waya[5]={0,0,1,-1};
int wayb[5]={1,-1,0,0};
struct go{
	int x,y,zh,t;//zh是平面镜使用次数,t是方向
	bool operator<(const go &a)const{
		return a.zh<zh;
	}
};
priority_queue<go>p;
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]=='C'&&!sx&&!sy)sx=i,sy=j;
		}
	}
	p.push(go{sx,sy,0,10});
	while(!p.empty()){
		go t=p.top();
		p.pop();
		if(a[t.x][t.y]=='C'&&(t.y!=sy||t.x!=sx)){
			cout<<t.zh-1;
			return 0;
		}
		if(a[t.x][t.y]=='*'||t.x<1||t.y<1||t.x>n||t.y>m||vis[t.x][t.y][t.t])continue;
		vis[t.x][t.y][t.t]=1;
		for(int i=0;i<4;i++){
			if(t.t%2){
				if(i==t.t-1)continue;
			}else{
				if(i==t.t+1)continue;
			}//防止180度转弯
			int xx=waya[i]+t.x,yy=wayb[i]+t.y;
			if(t.t!=i){
				p.push(go{xx,yy,t.zh+1,i});
			}else{
				p.push(go{xx,yy,t.zh,t.t});
			}
		}
	}
	cout<<-1;
	return 0;
}
2024/9/14 22:41
加载中...