POJ - 2362 - 搜索顺序和方法很重要..

本文介绍了一种解决四边形填充问题的算法。通过优化搜索策略,先对线段进行排序,然后采用深度优先搜索(DFS)的方式,按顺序尝试将线段放置于四条边上,以此寻找可行解。该方法有效减少了无效尝试,显著提高了算法效率。

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

    最开始这题我是想4条边分开看..找到一种方法填满第一条边,再填第二条....直道第四条添满..则说明找到一组解....但是WA了..不知道为什么不行..感觉上相互是没有联系的..但Discuss里的不少数据确实证明这种方法是不可行的...

    然后就是搜索罗...因为长的线段显然对结果影响更大..所以将线段从大到小排序...开始我的搜索是让每个线段往4条边上分别尝试着放..直道所有线段放好..结果TLE..\

    后来再一想..若DFS放满一条边后再DFS来放第二条边..这样自然就大大减少了没意义的尝试...同时若后面的边做不下去了..也能回朔回来(最初的方法就是没这个..)...这样的话就能AC了..250ms.....


Program:

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<queue>
using namespace std;  
int t,n,data,a[25],have[4];
bool used[25];
bool DFS(int k,int p)
{
      int i;
      if (p==4) return true;
      for (i=k;i<=n;i++)
        if (!used[i] && data-have[p]>=a[i])
        {
              have[p]+=a[i];
              used[i]=true;
              if (have[p]==data)
              {
                   if (DFS(1,p+1)) return true;
              }else if (DFS(i+1,p)) return true;
              used[i]=false;
              have[p]-=a[i];  
        }
      return false;      
}
bool getanswer()
{
      int i; 
      if (data%4) return false;
      data/=4; 
      memset(have,0,sizeof(have));
      memset(used,false,sizeof(used));
      return DFS(1,0);
}
bool cmp(int a,int b)
{
      return a>b;
}
int main()
{   
      freopen("input.txt","r",stdin);
      freopen("output.txt","w",stdout);
      scanf("%d",&t);
      while (t--)
      {
           int i;
           scanf("%d",&n);
           data=0;
           for (i=1;i<=n;i++) 
           {
                 scanf("%d",&a[i]); 
                 data+=a[i];
           }
           sort(a+1,a+1+n,cmp);
           if (getanswer()) printf("yes\n"); else printf("no\n");
      }
      return 0;   
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值