1 条题解

  • 0
    @ 2025-4-9 20:50:31

    问题分析

    这是一个关于移动电话中继塔频率分配的问题。当移动电话的中继塔与所在区域的移动电话进行通信时,为避免干扰,相邻的中继塔所分配的频率差值至少为 2 ,并且要使用尽可能少的频率来为这些中继塔分配频率。代码的任务是根据给定的中继塔坐标,判断并输出最少需要多少种频率来满足分配要求。

    代码整体思路

    代码首先读取中继塔的数量和坐标,然后根据坐标计算出哪些中继塔是相邻的(距离不超过 20 ,即距离的平方不超过 400 ),并将相邻关系记录在邻接矩阵 g 中。接着通过深度优先搜索(DFS)尝试用不同数量的频率(从 1 到 4 )对中继塔进行染色(分配频率),找到满足条件的最少频率数量并输出。

    详细代码

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    int num; 
    int n;
    int g[40][40];
    double x[40];
    double y[40];
    int color[40];
    bool dfs(int i)
    {
    	for(int c=1;c<=num;c++)
    	{
    		int flag=0;
    		for(int j=0;j<n;j++)
    		{
    			if(g[j][i]==1 && color[j]==c)
    			{
    				flag=1;
    				break;
    			}
    		}
    		if(flag==0)
    		{
    			color[i]=c;
    			if(i==n-1)
    			{
    				return true;
    			}
    			return dfs(i+1);
    			color[i]=0;
    		}
    	}
    	return false;
    }
    int main()
    {
    	int tag=0;
    	while(1)
    	{
    		tag++;
    		cin>>n;
    		if(n==0)
    		{
    			break;
    		}
    		memset(g,0,sizeof(g));
    		for(int i=0;i<n;i++)
    		{
    			cin>>x[i]>>y[i];
    		} 
    		for(int i=0;i<n;i++)
    		{
    			for(int j=i+1;j<n;j++)
    			{
    				if((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])<=400)
    				{
    					g[i][j]=g[j][i]=1;
    				}
    			}
    		}
    		for(num=1;num<=4;num++)
    		{
    			memset(color,0,sizeof(color));
    			if(dfs(0))
    			{
    				printf("The towers in case %d can be covered in %d frequencies.\n",tag,num);
    				break;
    			}
    		}
    	} 
    	return 0;
    }
    
    • 1

    信息

    ID
    621
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    3
    已通过
    1
    上传者