POJ 2362 Square

题意:给n个木棍,问能不能正好拼成一个正方形。

解法:POJ1011的简单版……不需要太多剪枝……随便剪一剪就好了……但是各种写屎来着QAQ

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#include<iomanip>
#define LL long long
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1

using namespace std;

int n;
int stick[25];
bool vis[25];
bool dfs(int len, int remlen, int pos, int num)
{
    if(remlen == 0)
    {
        if(num == 3) return true;
        return dfs(len, len, 0, num + 1);
    }
    for(int i = pos; i < n; i++)
    {
        if(i > 0 && !vis[i - 1] && stick[i] == stick[i - 1]) continue;
        if(!vis[i] && remlen >= stick[i])
        {
            vis[i] = true;
            if(dfs(len, remlen - stick[i], i + 1, num)) return true;
            vis[i] = false;
        }
        if(!vis[i] && i == 0) return false;
    }
    return false;
}
bool cmp(int a, int b)
{
    return a > b;
}
int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        memset(vis, 0, sizeof vis);
        scanf("%d", &n);
        int sum = 0;
        int maxn = 0;
        for(int i = 0; i < n; i++)
        {
            scanf("%d", &stick[i]);
            sum += stick[i];
            maxn = max(maxn, stick[i]);
        }
        sort(stick, stick + n, cmp);
        if(sum % 4 != 0 || maxn > sum / 4 || n < 4)
        {
            puts("no");
            continue;
        }
        if(dfs(sum / 4, sum / 4, 0, 1)) puts("yes");
        else puts("no");
    }
    return 0;
}

  

时间: 2024-08-02 07:00:29

POJ 2362 Square的相关文章

DFS POJ 2362 Square

题目传送门 1 /* 2 DFS:问能否用小棍子组成一个正方形 3 剪枝有3:长的不灵活,先考虑:若根本构不成正方形,直接no:若第一根比边长长,no 4 这题是POJ_1011的精简版:) 5 */ 6 #include <cstdio> 7 #include <iostream> 8 #include <cstring> 9 #include <map> 10 #include <set> 11 #include <cmath>

POJ 2362:Square(DFS)

问所给木棒能否构成一个正方形 难点在于木棒可以拼接,比如2 2 1 1 2也是能构成正方形的 这题的剪枝有点意思: 第一是提前判断所给的木棒长度之和能否被4整除,不能直接输出NO 第二是只需满足上面的条件后,只需要找到3条边就行了,剩下一条边自然也符合 l表示已找到的长度,cnt为已找到的边 #include"cstdio" #include"cmath" #include"cstring" #include"algorithm&quo

POJ 2362

知识点:dfs(深度优先搜索) 题解:基本的dfs搜索判断可行性问题.一般的dfs搜索,如果不加剪枝,复杂度是指数级的,所以必须要能发掘出优秀的剪枝条件: 在本题中,一般有如下剪枝: ①:所有线段的长度之和必须为4的倍数:②:搜索之前,把所有线段按从大到小排序,因为长度越长,在拼凑时的灵活度就越低:③:当能拼凑出3根等长的线段时,第四根就无须再搜了:④:当用某一条线段无法得出可行解时,和它等长的,一样不可以: 有了以上四个剪枝条件,这题就可以过了: add:这题理解之后可以去看看poj 1011

POJ 2362:Square 觉得这才算深度搜索

Square Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 21821   Accepted: 7624 Description Given a set of sticks of various lengths, is it possible to join them end-to-end to form a square? Input The first line of input contains N, the nu

poj 1084 Square Destroyer dlx解重复覆盖

分析: 将问题转化为重复覆盖问题,DancingLink解决. 代码: //poj 1084 //sep9 #include <iostream> using namespace std; const int maxN=10024; const int maxL=128; int L[maxN],R[maxN],U[maxN],D[maxN]; int C[maxN],H[maxN]; int S[maxN],A[maxN],X[maxN]; bool makeup[maxL][maxL];

(中等) POJ 1084 Square Destroyer , DLX+可重复覆盖。

Description The left figure below shows a complete 3*3 grid made with 2*(3*4) (=24) matchsticks. The lengths of all matchsticks are one. You can find many squares of different sizes in the grid. The size of a square is the length of its side. In the

POJ 1084 Square Destroyer【舞蹈链】【重复覆盖】

建模很容易就能说清楚,但我一直想不出来. 要问为什么的话可能是因为这题要先预处理出来所有正方形,而我没做过要预处理的舞蹈链的题.所以想不到. 那就是预处理出来所有正方形,用一个long long来表示一个正方形,这个正方形有没有包含id这条边就用 (1<<id)&num判断.那怎么预处理所有正方形呢,枚举边长1-n的正方形,然后再枚举这个正方形左上方的顶点就能做出来. 然后就能建模了,火柴是行,所有按现有火柴能拼出来的正方形是列,与其说是精准覆盖倒也可以说是全部破坏. http://e

[DLX重复覆盖] poj 1084 Square Destroyer

题意: n*n的矩形阵(n<=5),由2*n*(n+1)根火柴构成,那么其中会有很多诸如边长为1,为2...为n的正方形,现在可以拿走一些火柴,那么就会有一些正方形被破坏掉. 求在已经拿走一些火柴的情况下,还需要拿走至少多少根火柴可以把所有的正方形都破坏掉. 思路: 对于每个位置遍历所有可能的边长,确定这个边长下的正方形的边对应的都是数字几,并且把正方形从1开始编号. 然后根据编号,把正方形和数字建边记录方便下面建图. 然后以火柴棍为行,正方形为列,建立dancing link 然后求解. 这里

[DLX反复覆盖] poj 1084 Square Destroyer

题意: n*n的矩形阵(n<=5),由2*n*(n+1)根火柴构成,那么当中会有非常多诸如边长为1,为2...为n的正方形,如今能够拿走一些火柴,那么就会有一些正方形被破坏掉. 求在已经拿走一些火柴的情况下.还须要拿走至少多少根火柴能够把全部的正方形都破坏掉. 思路: 对于每一个位置遍历全部可能的边长,确定这个边长下的正方形的边相应的都是数字几,而且把正方形从1開始编号. 然后依据编号,把正方形和数字建边记录方便以下建图. 然后以火柴棍为行,正方形为列,建立dancing link 然后求解.