【HDOJ】2589 正方形划分

暴力DFS

 1 /* 2589 */
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5
 6 #define MAXN 21
 7
 8 bool map[MAXN][MAXN];
 9 bool visit[MAXN][MAXN];
10 int l, n;
11
12 bool dfs(int cnt) {
13     int i, j, k;
14     int x, y, r;
15     int ex, ey;
16     bool flag = true;
17
18     for (x=1; x<=l; ++x) {
19         for (y=1; y<=l; ++y) {
20             if (!visit[x][y]) {
21                 flag = false;
22                 break;
23             }
24         }
25         if (flag == false)
26             break;
27     }
28     if (flag) {
29         if (cnt == 0)
30             return true;
31         else
32             return false;
33     }
34     flag = true;
35     for (r=0; flag&&r<l; ++r) {
36         ex = x + r;
37         ey = y + r;
38         if (ex>l || ey>l)
39             break;
40         k = 0;
41         for (i=x; i<=ex; ++i) {
42             for (j=y; j<=ey; ++j) {
43                 if (map[i][j])
44                     ++k;
45                 if (k>1 || visit[i][j]) {
46                     flag = false;
47                     break;
48                 }
49             }
50             if (flag == false)
51                 break;
52         }
53         if (k==1 && flag) {
54             for (i=x; i<=ex; ++i)
55                 for (j=y; j<=ey; ++j)
56                     visit[i][j] = true;
57             if (dfs(cnt - 1))
58                 return true;
59             for (i=x; i<=ex; ++i)
60                 for (j=y; j<=ey; ++j)
61                     visit[i][j] = false;
62         }
63     }
64     return false;
65 }
66
67 int main() {
68     int t;
69     int i, j, k;
70     bool flag;
71
72     #ifndef ONLINE_JUDGE
73         freopen("data.in", "r", stdin);
74     #endif
75
76     scanf("%d", &t);
77     while (t--) {
78         scanf("%d %d", &l, &n);
79         memset(map, false, sizeof(map));
80         memset(visit, false, sizeof(visit));
81         flag = true;
82         for (i=0; i<n; ++i) {
83             scanf("%d %d", &j, &k);
84             if (map[j][k])
85                 flag = false;
86             map[j][k] = true;
87         }
88         if (flag) {
89             flag = dfs(n);
90         }
91         if (flag)
92             puts("YES");
93         else
94             puts("NO");
95     }
96
97     return 0;
98 }
时间: 2024-12-15 11:20:03

【HDOJ】2589 正方形划分的相关文章

HDU2589 正方形划分 【DFS】

正方形划分 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 179    Accepted Submission(s): 87 Problem Description 一个边长为L的正方形可以分成 L*L个小正方形. 有N个石子放在 N个小正方形里,能否将它分成 N个 正方形,使得每个正方形里恰有一个石子且这N 个正方形恰好构成整个正方

HDU2589 正方形划分【DFS】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2589 题目大意: 有一个边长为L的正方形有L*L个小正方形,将N个小石子放在N个小正方形中,给你N个小石子所放 位置,那么问题来了:能否将这个变成为L的正方形分割成N个正方形,使得每个正方形中都含有1个 小石子,并且这N个正方形正好构成整个正方形. 测试样例1说明: 边长为5的大正方形里有8个小石子,正好能将大正方形分解成8个小正方形,且每个正方形中有1个 小石子. 思路: 用DFS来做这道题.用

正方形划分【dfs】

Problem Description 一个边长为L的正方形可以分成 L*L个小正方形. 有N个石子放在 N个小正方形里,能否将它分成 N个 正方形,使得每个正方形里恰有一个石子且这N 个正方形恰好构成整个正方形 . Input 输入数据首先包含一个整数T,表示测试实例的个数,然后是T组数据,每组第一行包含2个整数L,N,接下来有N行每行2个整数 r,c,表示第r行c列的小正方形里有一个石子 .1<L<=20;1<N<=L*L; 1<=r,c<=L. Output 对于

HDOJ题目4417 Super Mario(划分树求区间比k小的个数+二分)

Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3313    Accepted Submission(s): 1548 Problem Description Mario is world-famous plumber. His "burly" figure and amazing jumping a

【递归】地盘划分 暴力

问题 W: [递归]地盘划分 修罗王和邪狼被关进监狱,该监狱的地下秩序实际被不少暗势力所把持,这些暗势力根据其实 力不同,划分出了大大小小的势力范围.具体划分方式是这样的:监狱是一个给定的矩形,每一个暗势力的势力范围都必须是一个正方形,划分时,最大的暗势力尽 可能多地从矩形中划分一块正方形,接下来,第二大的暗势力在剩下的矩形中尽可能多的划分一块正方形……例如,图2.1中所示是一个3×4的矩阵,可最少划 分为4个势力范围. 也就是说,取走一个3×3的正方形后,将问题规模变成3×1,然后变成2×1,

【HDOJ 4763】 Theme Section (KMP+strstr)

[HDOJ 4763] Theme Section Theme Section Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1999    Accepted Submission(s): 947 Problem Description It's time for music! A lot of popular musicians a

【HDOJ】3473 Minimum Sum

划分树解.主席树解MLE. 1 /* 3473 */ 2 #include <iostream> 3 #include <sstream> 4 #include <string> 5 #include <map> 6 #include <queue> 7 #include <set> 8 #include <stack> 9 #include <vector> 10 #include <deque>

界面设计原则之一篇:权衡优先级 突出焦点 划分好内容层级

界面设计时,如果面临太多元素,如何调节各元素以使客户满意呢?需要把握住三点,即综合考量各元素的优先级:抓住焦点,突出最主要元素:按浏览者获取信息的先后次序,对内容按主次进行排序. [编者按]界面设计时,我们不能强调所有元素,否则将毫无重点.正如所有人都大声呐喊,一片杂乱,我们将听不到任何信息一样.当界面设计面对很多元素时,如何调配各元素之间的关系,这时需要把握住三点:优先级.焦点.内容层级.<Design Principles: Dominance, Focal Points And Hiera

hdoj 1518 Square 【dfs】

题意:给出n个(不同长度的)棍子,问能不能将他们构成一个正方形. 策略:深搜. hdoj 1455的简化版 代码: #include <stdio.h> #include <string.h> #include <algorithm> #define M 25 using namespace std; int s[M], n, ans;//ans就是答案 bool vis[M]; int dfs(int cou, int cur, int pos){ //cou是已分配