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

Posted 登登登ccc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

以上是关于CCF 201403-4 无线网络 100分(bfs)的主要内容,如果未能解决你的问题,请参考以下文章

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

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

CCF_ 201403-4_无线网络

CCF201709-4 通信网络(100分)DFS+BFS

CCF202104-3 DHCP服务器(100分)模拟

CCF认证历年试题