zoj 1179 Finding Rectangles

本文探讨使用动态规划和暴力搜索技术解决特定几何问题,具体为寻找覆盖点集的矩形数量。通过实例分析,展示了算法实现过程及优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

据说可以用动态规化解,想不出来就用爆搜结果过了。

输出格式让我纠结了很久一直WA

#include<cstdio>
#include<cstring>
#define MAX 27
struct edge{
  int x,y;
  char tag;
};
edge edges[MAX];
int p[4];
bool  vis[MAX];
int num;
bool flag;
int ansnum=0;
bool canput(edge a, int b)
{

    switch(b)
    {

        case 0: return true;

        case 1:   if(a.y==edges[p[0]].y&&a.x>edges[p[0]].x)return true ;
                    else return false ;

        case 2:  if(a.x==edges[p[1]].x&&a.y<edges[p[1]].y) return true ;

                   else return false ;
        case 3: if(a.x==edges[p[0]].x&&a.y==edges[p[2]].y) return true;
                   else return false;
    }


}
void dfs(int n )
{

    int i,j;
    if(n==4)
    {
        if(++ansnum>10)
        {printf("\n");
         ansnum=1;

        }
        if(flag) printf("\n");
         printf(" ");
        for(j=0; j<4; j++)
        {
            printf("%c",edges[p[j]].tag);

        }
        flag=false;

        return ;
    }
  for(i=0; i<num; i++)
  {
      if(!vis[i]&&canput(edges[i],n))
      {
          vis[i]=true;
          p[n]=i;

          dfs(n+1);
          vis[i]=false;
      }
  }
}

int main()
{
    int no=0;
    int i;

    while(scanf("%d",&num),num)
    {
        getchar();
        no++;
        for( i=0; i<num; i++)
        {

           scanf("%c %d %d",&edges[i].tag,&edges[i].x,&edges[i].y);
           getchar();

        }
       memset(vis,0,sizeof(vis));
       flag=true;

     ansnum=0;

      printf("Point set %d:",no);
     dfs(0);
     if(flag)
        printf(" No rectangles\n");
     else
         printf("\n");
    }

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值