2018焦作区域赛 F - Honeycomb Gym - 102028F(BFS)

图看起来很复杂,但是仔细想想其实根本就不用建图,一共六个方向直接bfs就行,具体见代码。
AC代码:

#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=5010,M=7010;
typedef pair<int,int> PII;
PII St,ed;
int n,m;
char g[N][M];

int dx[6]={2,2,-2,-2,4,-4};
int dy[6]={-6,6,-6,6,0,0};

int nx[6]={1,1,-1,-1,2,-2};
int ny[6]={-3,3,-3,3,0,0};

struct node{
	int x,y,dist;
};
queue<node>q;
void solve(){
	cin>>n>>m;
	
	for(int i=0;i<=4*n+10;i++)
	for(int j=0;j<=6*m+10;j++)
	g[i][j]=' ';
	
	getchar();
	for(int i=1;i<=4*n+3;i++) {
		gets(g[i] + 1);
	}
	
	
	for(int i=1;i<=4*n+3;i++)
	for(int j=1;j<=6*m+3;j++)
	if(g[i][j]=='S') St={i,j};
	else if(g[i][j]=='T')ed={i,j};
	while(q.size()) q.pop();
	
	q.push({St.x,St.y,0});
	int res=-1;
	while(q.size()){
		auto t=q.front();
		q.pop();
		
		for(int i=0;i<6;i++){
			int a=t.x+dx[i],b=t.y+dy[i],dist=t.dist+1;
			int aa=t.x+nx[i],bb=t.y+ny[i];
			if(a<1||a>4*n+3||b<1||b>6*m+3)continue;
			if(g[aa][bb]!=' '||g[a][b]=='@')continue;
			
			g[a][b]='@';
			
			if(a==ed.x&&b==ed.y){
				cout<<dist+1<<endl;
				return; 
			}
			
			q.push({a,b,dist});
		}
	}	
	
	
	
	cout<<res<<endl;
}

main(){
	int T;
	cin>>T;
	while(T--)solve();
}```

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值