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>
12 #include <algorithm>
13 using namespace std;
14
15 const int MAXN = 22;
16 const int INF = 0x3f3f3f3f;
17 int a[MAXN];
18 bool vis[MAXN];
19 int len, sum;
20 int n, m;
21
22 bool cmp(int x, int y)
23 {
24     return x > y;
25 }
26
27 bool DFS(int ans, int cnt, int s)
28 {
29     if (cnt == 3)
30     {
31         return true;
32     }
33
34     for (int i=s; i<=m; ++i)
35     {
36         if (!vis[i] && ans + a[i] <= len)
37         {
38             vis[i] = true;
39             if (ans + a[i] == len)
40             {
41                 if (DFS (0, cnt + 1, 1) == true)    return true;
42                 vis[i] = false;
43             }
44             else
45             {
46                 if (DFS (ans + a[i], cnt, i) == true)  return true;
47                 vis[i] = false;
48             }
49         }
50     }
51
52     return false;
53 }
54
55 int main(void)      //POJ 2362 Square
56 {
57     //freopen ("POJ_2362.in", "r", stdin);
58
59     scanf ("%d", &n);
60     while (n--)
61     {
62         sum = 0;
63         memset (vis, 0, sizeof (vis));
64
65         scanf ("%d", &m);
66         for (int i=1; i<=m; ++i)
67         {
68             scanf ("%d", &a[i]);
69             sum += a[i];
70         }
71         sort (a+1, a+1+m, cmp);     //Cut 1
72
73         if (m < 4 || sum % 4 != 0)      //Cut 2
74         {
75             puts ("no");    continue;
76         }
77         len = sum / 4;
78
79         if (a[1] > len)     //Cut 3
80         {
81             puts ("no");        continue;
82         }
83
84         if (DFS (0, 0, 1) == true) puts ("yes");
85         else    puts ("no");
86     }
87
88     return 0;
89 }
90
91
92 /*
93 yes
94 no
95 yes
96 */
时间: 2024-10-12 18:54:50

DFS POJ 2362 Square的相关文章

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 Square

题意:给n个木棍,问能不能正好拼成一个正方形. 解法:POJ1011的简单版……不需要太多剪枝……随便剪一剪就好了……但是各种写屎来着QAQ 代码: #include<stdio.h> #include<iostream> #include<algorithm> #include<string> #include<string.h> #include<math.h> #include<limits.h> #include&

POJ 2362

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

dfs/poj 2488 A Knight&#39;s Journey

1 #include<cstdio> 2 using namespace std; 3 const int b[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}}; 4 int a[30][30],p,q; 5 struct 6 { 7 int x,y; 8 }step[910]; 9 10 bool dfs(int x,int y,int now) 11 { 12 if (now==p*q) return true;

DFS POJ 3087 Shuffle&#39;m Up

题目传送门 1 /* 2 题意:两块扑克牌按照顺序叠起来后,把下半部分给第一块,上半部给第二块,一直持续下去,直到叠成指定的样子 3 DFS:直接模拟搜索,用map记录该字符串是否被搜过.读懂题目是关键. 4 */ 5 /************************************************ 6 Author :Running_Time 7 Created Time :2015-8-3 13:57:55 8 File Name :POJ_3087.cpp 9 *****

搜索 || DFS || POJ 2488 A Knight&#39;s Journey

给一个矩形棋盘,每次走日字,问能否不重复的走完棋盘的每个点,并将路径按字典序输出 *解法:按字典序输出路径,因此方向向量的数组按字典序写顺序,dfs+回溯,注意flag退出递归的判断,并且用pre记录路径 #include <iostream> #include <cstdio> #include <cstring> using namespace std; char a[30][30]; int dx[] = {-2, -2, -1, -1, 1, 1, 2, 2};

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];

[ tarjan + dfs ] poj 2762 Going from u to v or from v to u?

题目链接: http://poj.org/problem?id=2762 Going from u to v or from v to u? Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14546   Accepted: 3837 Description In order to make their sons brave, Jiajia and Wind take them to a big cave. The cav