Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1562179
  • 博文数量: 327
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 3556
  • 用 户 组: 普通用户
  • 注册时间: 2005-04-05 21:28
个人简介

东黑布衣,流浪幽燕。 真诚善良,值得信赖。

文章分类

全部博文(327)

我的朋友

分类: BSD

2017-04-20 20:12:00

Two base station.
在给定的网格上有两个敌对的联盟,alpha联盟和beta联盟
alpha联盟的成员用1表示,beta联盟的成员用2表示,0表示空地。
现在要在空地建两个基站使其能覆盖所有alpha联盟的成员,但是不能覆盖beta联盟的成员
基站的覆盖半径为正整数,且至少有一个alpha成员由两个基站同时覆盖。
现在要求满足要求的两个最近的基站的距离,如果不满足输出-1

思路:
1. 定义一个4维数组d[9][9][9][9], 将任意两点的距离d[x][y][a][b], (x,y)到(a,b)存储起来。
2. 定义链表0,链表元素为下面的结构,存储所有的空地的座标和最大半径(不至于覆盖到beta联盟成员),目前最大半径还没有赋值。
  1. typedef struct _node{
  2.    int x,y,count,maxr;
  3. }node;
2. 定义链表A,存储所有alpha联盟的节点座标
3. 定义链表B,存储所有beta联盟的节点座标
4. for 所有链表0的元素
        for 所有链表B的元素
               分别计算0的某一点和所有B中节点的距离,取最小的存入链表0的成员maxr
5. for 所有链表0的元素
        for 所有链表0的元素
             选取两个不同的点,每个alpha节点有个计数count,初始为0. i点遍历一遍,在覆盖内 count++, j点遍历一遍,在覆盖内count++。 然后再扫一遍链表A如果所有alpha节点count>0 且 至少一个节点count大于1,则满族条件。然后对这样的两点计算距离平方和,取个最小值。


  1. // 20170419adv.cpp : 建设基站
  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. typedef struct _node0{
  5.    int x,y,maxr;
  6.    struct _node0 *nt;
  7. }node0;

  8. typedef struct _node1{
  9.    int x,y,count;
  10.    struct _node1 *nt;
  11. }node1;

  12. typedef struct _node2{
  13.    int x,y;
  14.    struct _node2 *nt;
  15. }node2;

  16. node0 *h0,*p0,*q0,*r0,*s0;
  17. node1 *h1,*p1,*q1,*r1;
  18. node2 *h2,*p2,*q2,*r2;
  19. int nbr0,nbr1,nbr2;

  20. int N;
  21. int a[9][9];
  22. int d[9][9][9][9];
  23. int flag1,flag2,result,tmpmin;

  24. void calc_distance(void)
  25. {
  26.    int i,j,k,l;
  27.    for(i=0;i<9;i++)
  28.       for(j=0;j<9;j++)
  29.          for(k=0;k<9;k++)
  30.             for(l=0;l<9;l++)
  31.                d[i][j][k][l]=(i-k)*(i-k) + (j-l)*(j-l);
  32. }

  33. void linklist_initialize(void)
  34. {
  35.    int i,j;
  36.    for(i=0;i<=N;i++)
  37.    {
  38.       for(j=0;j<=N;j++)
  39.       {
  40.          scanf("%d", &a[i][j]);
  41.          if(a[i][j]==0)
  42.          {
  43.             p0=(node0*)malloc(sizeof(node0));
  44.             p0->x=i;
  45.             p0->y=j;
  46.             p0->maxr=-1;
  47.             p0->nt=NULL;
  48.             if(h0==NULL)
  49.                h0=p0;
  50.             else
  51.                q0->nt=p0;
  52.             q0=p0;
  53.             nbr0++;
  54.          }
  55.          else if(a[i][j]==1)
  56.          {
  57.             p1=(node1*)malloc(sizeof(node1));
  58.             p1->x=i;
  59.             p1->y=j;
  60.             p1->count=0;
  61.             p1->nt=NULL;
  62.             if(h1==NULL)
  63.                h1=p1;
  64.             else
  65.                q1->nt=p1;
  66.             q1=p1;
  67.             nbr1++;
  68.          }
  69.          else if(a[i][j]==2)
  70.          {
  71.             p2=(node2*)malloc(sizeof(node2));
  72.             p2->x=i;
  73.             p2->y=j;
  74.             p2->nt=NULL;
  75.             if(h2==NULL)
  76.                h2=p2;
  77.             else
  78.                q2->nt=p2;
  79.             q2=p2;
  80.             nbr2++;
  81.          }
  82.          else{
  83.             printf("Unexpected error\n");
  84.          }
  85.       }
  86.    }
  87. }

  88. void calc_max_radius(void)
  89. {
  90.    int mr,tmp;
  91.    int outflag=0;
  92.    r0=h0;
  93.    while(r0!=NULL)
  94.    {
  95.       mr=8;
  96.       r2=h2;
  97.       while(r2!=NULL)
  98.       {
  99.          tmp=d[r0->x][r0->y][r2->x][r2->y];
  100.          if(tmp==1)
  101.          {
  102.             if(r0==h0)
  103.             {
  104.                h0=h0->nt;
  105.                q0=h0;
  106.                free(r0);
  107.                r0=q0;
  108.             }
  109.             else
  110.             {
  111.                q0->nt=r0->nt;
  112.                free(r0);
  113.                r0=q0->nt;
  114.             }
  115.             nbr0--;
  116.             outflag=1;
  117.             break;
  118.          }
  119.          while(mr*mr >= tmp)
  120.             mr--;
  121.          r2=r2->nt;
  122.       }
  123.       if(outflag==1)
  124.       {
  125.          outflag=0;
  126.          continue;
  127.       }
  128.       r0->maxr=mr;
  129.       q0=r0;
  130.       r0=r0->nt;
  131.    }
  132. }
  133. void linklist_free(void)
  134. {
  135.    r0=h0->nt;
  136.    while(r0!=NULL)
  137.    {
  138.       free(h0);
  139.       h0=r0;
  140.       r0=r0->nt;
  141.    }
  142.    free(h0);
  143.    h0=p0=q0=r0=s0=NULL;

  144.    r1=h1->nt;
  145.    while(r1!=NULL)
  146.    {
  147.       free(h1);
  148.       h1=r1;
  149.       r1=r1->nt;
  150.    }
  151.    free(h1);
  152.    h1=p1=q1=r1=NULL;

  153.    r2=h2->nt;
  154.    while(r2!=NULL)
  155.    {
  156.       free(h2);
  157.       h2=r2;
  158.       r2=r2->nt;
  159.    }
  160.    h2=p2=q2=r2=NULL;
  161. }

  162. int main(int argc, char* argv[])
  163. {
  164.    int t,test_case;

  165.    calc_distance();

  166.    freopen("20170419in.txt","r",stdin);
  167.    scanf("%d", &test_case);
  168.    for(t=1;t<=test_case;t++)
  169.    {
  170.       scanf("%d",&N);
  171.       h0=NULL;
  172.       h1=NULL;
  173.       h2=NULL;
  174.       nbr0=nbr1=nbr2=0;

  175.       linklist_initialize();

  176.       calc_max_radius();//calc max radius for every point in 0 linklist

  177.       result=-1;
  178.       tmpmin=0;
  179.       r0=h0;
  180.       while(r0!=NULL)
  181.       {
  182.          s0=r0->nt;
  183.          while(s0!=NULL)
  184.          {
  185.             flag1=1;
  186.             flag2=0;
  187.             r1=h1;//For any two-point combination, all alpha's counter must be initialized
  188.             while(r1!=NULL)
  189.             {
  190.                r1->count=0;
  191.                r1=r1->nt;
  192.             }

  193.             r1=h1;
  194.             while(r1!=NULL)
  195.             {
  196.                if((r0->maxr)*(r0->maxr) >= d[r0->x][r0->y][r1->x][r1->y])
  197.                   r1->count++;
  198.                r1=r1->nt;
  199.             }
  200.             r1=h1;
  201.             while(r1!=NULL)
  202.             {
  203.                if((s0->maxr)*(s0->maxr) >= d[s0->x][s0->y][r1->x][r1->y])
  204.                   r1->count++;
  205.                r1=r1->nt;
  206.             }
  207.             r1=h1;
  208.             while(r1!=NULL)
  209.             {
  210.                if(r1->count<1)
  211.                {
  212.                   flag1=0;
  213.                   break;
  214.                }
  215.                if(r1->count>1)
  216.                   flag2=1;
  217.                r1=r1->nt;
  218.             }
  219.             if(flag1==1 && flag2==1)
  220.             {
  221.                tmpmin=d[r0->x][r0->y][s0->x][s0->y];
  222.                if(result==-1)
  223.                   result=tmpmin;
  224.                else if(result>tmpmin)
  225.                   result=tmpmin;
  226.             }

  227.             s0=s0->nt;
  228.          }//inner while
  229.          r0=r0->nt;
  230.       }//outer while

  231.       printf("#%d %d\n",t,result);

  232.       linklist_free();
  233.    }//every cases

  234.    fclose(stdin);
  235.    return 0;
  236. }

/* input
5
5
0 2 0 2 0 2
2 0 2 0 1 0
0 2 0 1 0 1
2 0 1 0 1 0
0 2 0 1 0 2
2 0 2 0 2 0
7
0 0 0 0 0 2 0 0
0 0 0 1 0 0 0 2
0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 1 0 0 0 0 0
0 2 0 0 0 0 0 1
2 0 0 0 0 0 0 0
0 0 2 0 1 0 0 0
7
0 0 0 0 0 2 0 0
0 0 0 1 0 0 0 2
0 0 0 0 0 0 0 0
0 0 0 0 2 0 0 0
0 0 1 0 0 0 0 0
0 2 0 0 0 0 0 1
2 0 0 0 0 0 0 0
0 0 2 0 1 0 0 0
8
2 0 0 0 0 0 0 2 0
0 2 0 0 0 0 0 0 2
0 0 2 0 0 0 0 0 2
2 0 0 1 1 2 2 0 0
0 0 1 0 0 1 2 2 0
1 0 0 1 0 0 0 0 0
0 1 0 1 0 0 1 0 0
0 0 0 0 0 0 1 1 0
0 0 0 0 0 0 0 0 2
8
2 0 0 0 0 0 2 0 0
1 0 0 0 0 0 0 2 2
1 0 0 0 1 2 0 0 2
0 0 0 0 0 0 0 0 0
0 1 0 1 0 0 0 2 0
0 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0
0 1 0 1 0 0 0 0 0
2 0 0 0 2 0 2 2 0
*/

/*
#1 2
#2 8
#3 -1
#4 5
#5 4
*/



阅读(1424) | 评论(0) | 转发(0) |
0

上一篇:Viva Laliga

下一篇:ACM02_0408 Hero

给主人留下些什么吧!~~