洛谷 P2385 [USACO07FEB] Bronze Lilypad Pond B C语言 bfs

发布于:2024-11-29 ⋅ 阅读:(37) ⋅ 点赞:(0)

题目:

https://www.luogu.com.cn/problem/P2385

题目看仔细,是M行N列.八个方向数组依靠M1,M2,所以初始化方向数组要在主函数里面,传入bfs函数里。

#include <iostream>
#include<algorithm>
#include<queue>
using namespace std;
struct Node{
	int x;
	int y;
	int step;
};
queue <Node> q;
int N,M,M1,M2;
int stl [31][31];
int map[31][31];
int bfs(int x,int y ,int step,int dx[],int dy[])//传入数组 数组也可以这样传int bfs(int x,int y ,int step,int *dx,int *dy)
{
	Node start = {x,y,step};
	q.push(start);//压入队首 
	stl[x][y] = true;//标记已经过 
	
	while(!q.empty())
	{
		int x = q.front().x;//取出队首三个数据 
		int y = q.front().y;
		int step = q.front().step;
		if(map[x][y] == 4)
		{
			return step;
		}
		for(int k = 0 ; k < 8 ; k++)
		{
			int tx = x + dx[k];
			int ty = y + dy[k];
			if(tx >= 1 && tx <= 30 && ty >= 1 && ty <= 30 && stl[tx][ty] == false && (map[tx][ty] == 4 || map[tx][ty] == 1))//边界条件 
			{
				stl[tx][ty] = true;
				Node nowpos = {tx,ty,step+1};
				q.push(nowpos);
			}
		}
		q.pop();
	}
	return -1;
}
int main() 
{
	cin >> M >> N >> M1 >> M2;
	int ans;
	bool stl[100][100];
    int dx[8]={M2,M1,M1,-M2,-M2,-M1,-M1,M2};//初始化这八个方向 
    int dy[8]={M1,M2,-M2,M1,-M1,-M2,M2,-M1};
	for(int i = 1 ; i <= M ; i++)
	{
		for(int j = 1 ; j <= N ; j++)
		{
			cin >> map[i][j];
		}
	}
	
	for(int i = 1 ; i <= M ; i++)
	{
		for(int j = 1 ; j <= N ; j++)
		{
			if(map[i][j] == 3 && stl[i][j] == false)
			{
			ans = bfs(i,j,0,dx,dy);
			break;	
			}
		}
	}
	cout << ans;
	return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到