CCF 201403-4 无线网络 100分(bfs)

题目来源:- 计算机软件能力认证考试系统

这题不能用vector来记录结构体,必须用数组,不然通不过。

#include<bits/stdc++.h>

using namespace std;

struct Router {
	long long x,y;
	int step,limit;
	Router(long long xx=0, long long yy=0, int s=0, int l=0):x(xx),y(yy),step(s) {};
} v[210];


int BFS(int n, int m, int k, long long r) {
	bool visited[210];
	memset(visited, false, sizeof(visited));// 是否被访问

	queue<Router> q;
	q.push(v[0]);   //将根节点加入队列
	visited[0]=true;// 设置根结点为已经被访问

	while(!q.empty()) {  //队列为空停止
		Router cur=q.front(); //取队头元素
		q.pop(); //出队

		if(cur.x==v[1].x && cur.y==v[1].y) //到目的路由器终止
			return cur.step-1;

		int up;
		if(cur.limit == k)//增设路由器到上限后,就不在n+m中遍历,而是在n中遍历
			up=n;
		else
			up=n+m;

		for(int i=0; i<up; i++) {

			if(visited[i]) //被访问过则跳过
				continue;

            // 判定下一个路由器的坐标是否在半径r之内, 不在半径之内则跳过,在半径之内则继续搜索
			if((v[i].x-cur.x)*(v[i].x-cur.x)+(v[i].y-cur.y)*(v[i].y-cur.y) > r*r) 
				continue;
			else {
				visited[i]=true; //设置为已经被访问

				Router next(v[i].x,v[i].y,cur.step+1); //创建下一个进入队列的路由器结点
				if(i>=n)
					next.limit=cur.limit+1; //增设的路由器数量+1
				else
					next.limit=cur.limit;

				q.push(next); //入队

			}
		}

	}
	return 0;
}

int main() {
	int n,m,k;
	long long r;
	cin>>n>>m>>k>>r;

	long long x,y;
	for(int i=0; i<n+m; i++) {
		cin>>v[i].x>>v[i].y;

	}

	int ans=BFS(n,m,k,r);

	cout<<ans;
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值